JAVA------Stream流
2024-01-08 11:31:58
    		Stream流
- Collection提供了新的stream()方法
- 流不存储值,通过管道的方式获取值
- 本质是函数式的,对流的操作会生成一个结果,不过并不会修改底层的数据源,集合可以作为流的底层数据源
- 延迟查找,很多流操作(过滤、映射、排序等)都可以延迟实现。
流由3部分构成:
1.源
 2.零个或多个中间操作
 3.终止操作
流操作的分类:
1.惰性求值
 2.及早求值
stream.xxx().yyy().count()
 .xxx().yyy():惰性求值、零个或多个中间操作
 .count():及早求值、终止操作
public static void main(Strig[] args){
	Stream stream1 = Stream.of("你好","世界","啊");
	String[] myArrays = new String[]{"你好","世界","啊"};
	Stream stream2 = Stream.of(myArrays);
	Stream stream3 = Arrays.stream(myArrays);
	List<String> list = Arrays.asList(myArrays);
	Stream stream4 = list.stream();
}
Stream例子
public class StreamDemp {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(2,4,5,6);
        /*传统写法*/
        int sum = 0;
        for(Integer i : list){
            sum += 2 * i;
        }
        /*Stream写法*/
        System.out.println(list.stream().map(value -> value*2).reduce(0, Integer::sum));
        /*Lambda写法*/
        System.out.println(list.stream().map(value -> value*2).reduce(0,(a,b) ->a+b));
    }
}
打印数组
public class StreamDemo2 {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("das","add");
        //打印数组
        //String[] array = stream.toArray(value -> new String[value]);
        //方法一:方法引用的形式:String[] array = stream.toArray(String[]::new);
        //方法二:通过封装的形式:List<String> list = stream.collect(Collectors.toList());
        //方法三:因为调用的collect方法中需要有三个参数,其中第一个Supplier不需要接受参数,直接返回值。
        //       第二个参数:累加器是通过对我们传递的两个值,第一个值来add第二个值,第二个值在该方法中起到遍历的作用,遍历完添加的list1这个集合中,
        //       第三个参数,把第二个参数中遍历后的list1(相当于list4),都存放在list3中
        //List<String> list = stream.collect(()-> new ArrayList<String>(),(list1,item)->list1.add(item),(list3,list4)->list3.addAll(list4));
        //方法四:方法引用替换方法三
        //List<String> list = stream.collect(ArrayList::new, ArrayList::add,ArrayList::addAll);
        //方法五:以流的形式。
        //总结:方法二的原理就是方法三、四、五
        String toString = stream.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString();
        System.out.println(toString);
        Arrays.asList(toString).forEach(System.out::println);
    }
}

Stream<List<Integer>> stream = Stream.of(Arrays.asList(1),(Arrays.asList(2,3),(Arrays.asList(4,5,6));
stream.flatMap(theList -> theList.stream()).map(item -> item * item).foreach(System.out::println);
练习
 找出该流中大于2的元素,然后将每个元素乘以2,然后忽略掉流中的前两个元素,然后再取流中的前两个元素,最后求出流中元素的总和。
public static void main(String[] args){
	Stream<Integer> stream = Stream.iterate(1, item -> item + 2).limit(6);
	System.out.println(stream.filter(item -> item > 2).mapToInt(item -> item * 2).skip(2).limit(2).sum());
}
疑问:为什么min和max源码里面参数的类型为OptionInt,而sum为int类型?
 取决于该值能不能为null,因为sum方法纵使你前面无任何值,最后也会为0,而min和max当Stream里面没有值时,就会抛出以下异常。
 
 如何解决想使用min但是怕抛出异常的方法?
 解决方法
stream.filter(item -> item > 2).mapToInt(item -> item * 2).skip(2).limit(2).min().ifPresent(System.out::println);
如何同时获取最大值、最小值这些值?
 可以通过SummaryStatics
 代码演示
IntSummaryStatics summaryStatics = stream.filter(item -> item > 200).
								   mapInt(item -> item * 2).limit(2).summaryStatics();
System.out.println(summaryStatics.getMin());
System.out.println(summaryStatics.getCount());
System.out.println(summaryStatics.getMax());
stream只能使用一次
 代码理解
System.out.println(stream);
System.out.println(stream.filter(item -> item > 2));
System.out.println(stream.distinct());//报错
解决方法:
Stream<Integer> stream2 = stream.filter(item -> item > 2);
Stream<Integer> stream3 = stream2.distinct();

 
 分组和分区
 
Collector
suppplier用来创建一个结果容器
 accumulator不断地将元素累加到结果容器中
 combiner在多线程中用来合并结果
 finisher用来将结果容器类型转换为另一个类型
比较器详解与类型推断特例

 
 根本原因在于
 
 源码中是要求为数据类型或者往上的类型,不能为向下的类型。
    			文章来源:https://blog.csdn.net/Thrive_LCX/article/details/135401686
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
    	本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!