JDK8新特新之Stream流
什么是Stream流
Stream流,操作数据,与CPU打交道,只有执行终止操作才会执行中间链操作,并产生结果,之后不会在被使用
Stream流的分类
1.顺序流 Stream
2.并行流 parallelStream
怎么创建?
四种创建方式
// 1.集合方式创建 stream()
List<User> list1 = new ArrayList<User>();
list1.add(new User(23,"luo",2000));
list1.add(new User(24,"ljk",4000));
list1.add(new User(13,"jiang",7000));
list1.add(new User(203,"kang",1000));
Stream<User> userStream = list1.stream();
//中间操作
userStream.map(t1 -> t1.getName() + "cc").sorted((t1,t2)->t1.getName().compareTo(t2.getName())) .forEach(System.out::println);
// 2.数组方式创建 stream
int[] arr = new int[]{1,4,3,9,4,7,6};
IntStream stream1 = Arrays.stream(arr);
stream1.filter(t->t<5) .sorted().distinct().forEach(System.out::println);
// 3.利用Stream的静态方法of()创建stream
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6, 7);
integerStream.filter(t->t<5).forEach(System.out::println);
// 4.利用两种无限流创建stream
// iterate方式
Stream.iterate(0,t->t+2).limit(10).forEach(System.out::println);
//generate方式
Stream.generate(Math::random).limit(10).forEach(System.out::println);
中间操作的先后顺序
map filter forEach: 是垂直执行的,就是流中的每一个元素执行完便跳转到下一个中间操作
sorted: 是水平执行的,流中的每一个元素都必须连续经该中间操作处理
常用中间操作
limit(long maxSize):截取流,限制流的大小
sorted():对流中的元素进行自然排序
map(Function<? super T,? extends Stream<? extends R>> mapper):将提供的映射函数应用于每个元素,产生每个元素的结果组成的流
flatMap(Function<? super T,? extends Stream<? extends R>> mapper):将提供的映射函数应用于每个元素,产生的映射流的内容来替换该流的每个元素的结果的流。
filter(Predicate<? super T> predicate):过滤器,筛选出所需要的流元素
distinct():和数据库一样,去掉重复的流元素
sum(): 求流中所有元素的总和
常用终止操作
forEach(Consumer<? super T> action): 遍历,对每个流元素可以执行操作
注意:如果看不懂方法中的参数,建议先看 lambda表达式