Java 您所在的位置:网站首页 stream流排序对象 Java

Java

2023-03-31 17:38| 来源: 网络整理| 查看: 265

目录

一、概述

1.1、特性: 不存储数据、不改变数据源、不可重复使用

1.2、生成流的方式

1.3、反转流到集合

二、中间节点与终值节点

2.1、中间节点

2.2、终值节点

三、Stream的方法

3.1、迭代:peek()

3.2、终点:foreach()

3.3、流式处理

3.4、采集置换:collect()

一、概述

将集合或数组 转换成一种流的元素序列。流不是集合中的元素,也不是一种数据结构,不负责数据的存储。Stream 流也不会改变源对象(源集合)Stream 接口中几乎所有方法的参数都是四大函数式接口接口类型的参数。而函数式接口可以使用 lambda 表达式来简化开发,并且 Stream 接口中的方法基本都是返回对象本身(返回对象本身的方法可以使用链式编程)。所以在使用 Stream 流式计算时,基本上都用到了函数式接口、lambda表达式 和 链式编程。

1.1、特性: 不存储数据、不改变数据源、不可重复使用

可以看作一根管道,用于数据的转换,所以不会存储数据,也不会影响原来的数据。因为stream是一根管道,不可重复使用就是stream用完一次之后,数据就输出了

Stream stream1 = Stream.of(1,2,3); //创建stream2过滤stream1 Stream stream2 = stream1.filter(s->s.equals(1)); //下句代码会出错,因为stream1流用过一次,消失了 Stream stream3 = stream1.filter(s->s.equals(1)); 1.2、生成流的方式

Array.stream()-用于基本类型

parallelStream() 是并行流方法,并行流就是把内容分成多个数据块,使用不同的线程分别处理每个数据块的流。

Arrays.stream(new int[]{1,2,3}); //使用Array的静态方法创建流

但要注意的是,不是所有情况的适合,有些时候并行甚至比顺序进行效率更低,而有时候因为线程安全问题,还可能导致数据的处理错误,因此并行的性能问题非常值得我们思考。下面这个例子就比较慢,因为JVM对基本类型还要装箱开箱操作,不如直接串行计算了

int i = Stream.iterate(1, a -> a + 1).limit(100).parallel().reduce(0, Integer::sum);

Stream.of()-用于任何类型

Stream.of(1,"小明",2,new ArrayList()); //使用Stream的静态方法创建流

Stream.iterate-函数流

//iterate() : 依次对每个新生成的值应用函数; generate() :接受一个函数,生成一个新的值 //生成流,首元素为 0,之后依次加 2 Stream.iterate(0, n -> n + 2) //生成流,为 0 到 1 的随机双精度数 Stream.generate(Math :: random) //生成流,元素全为 1 Stream.generate(() -> 1)

Files.lines()-用于文件流

Stream stream = Files.lines(Paths.get(“data.txt”));

XXX.stream()-用于集合

Collection collection = new ArrayList(); collection.stream(); // 使用Collection类里的成员方法stream()方式创建流 1.3、反转流到集合

一般是用Stream.collect()的方法来实现的,下面给一个转为List的例子

public static void main(String[] args) { // 将数组变成一个列表集合 List list = Arrays.asList(14, 3, 5, 7, 12); // List集合获取 Stream 流 Stream stream = list.stream(); // 操作 Stream 流 List collect = stream // 获取 > 5 的元素 .filter((i) -> { return i > 5; }) // 对元素进行升序排序 .sorted() // 将 Stream 流转换成 List 集合 .collect(Collectors.toList()); // 遍历 转换后的 List 集合 for (Integer i : collect) { System.out.println(i); } } 二、中间节点与终值节点 2.1、中间节点

懒节点不会自动执行,所以下例代码不会打印hello

public static void main(String[] args) { List list = new ArrayList(); Stream.of(list).filter(a->{ System.out.println("hello"); return true; }); //没有打印结果 } 2.2、终值节点

这时在最后加了.toArray()方法,相当于加上了终值节点,那么此时终值节点+前面的节点都会执行

public static void main(String[] args) { List list = new ArrayList(); Stream.of(list).filter(a->{ System.out.println("hello"); return true; }).toArray(); //打印输出hello }

可以查看Stream的API,如果方法的返回值为Stream的基本都是中间节点

三、Stream的方法

常用的方法如下:

中间节点:filter()、map()、mapToInt()、flatMap()、sorted()、peek()、reduce()、distinct()终值节点:forEach()、toArray()、collect()

@Data public class AppleStore { int id; //编号 String color; //颜色 double weight; //重量 String origin; //产地 } 3.1、迭代:peek()

public class StreamTest { private static List appleStores = new ArrayList(); static { appleStores.add(new AppleStore(1,"red",1.2,"重庆")); appleStores.add(new AppleStore(2,"red",1.5,"四川")); appleStores.add(new AppleStore(3,"yellow",2.6,"重庆")); appleStores.add(new AppleStore(4,"yellow",2.9,"四川")); appleStores.add(new AppleStore(5,"red",3.2,"杭州")); } public static void main(String[] args) { //peek()是执行每个节点的方法 //peek里的方法会挨个执行,也就是节点会挨个执行,也称作责任链模式 appleStores.stream().peek(appleStore -> System.out.println(appleStore.getColor())) //打印苹果的颜色 .peek(appleStore -> System.out.println(appleStore.getWeight())) //打印苹果的重量 .peek(appleStore -> System.out.println(appleStore.getOrigin())) //打印苹果的产地 .toArray(); } } red1.2重庆 red1.5四川 yellow2.6重庆 yellow2.9四川 red3.2杭州 3.2、终点:foreach()

foreach功能和peek相同,不同是foreach是终值节点,也就是不能再往下继续执行,但执行的结果是和上面是一样的。

appleStores.stream().peek(apple -> System.out.println(apple.getColor())) //打印苹果编号 .peek(apple -> System.out.println(apple.getWeight())) //打印苹果颜色 .forEach(sout-> System.out.println(sout.getOrigin())); red1.2重庆 red1.5四川 yellow2.6重庆 yellow2.9四川 red3.2杭州 3.3、流式处理

3.3.1、过滤:filter(Predicate predicate)

@Test public void name2() { appleStores.stream().filter(appleStore -> appleStore.getColor().equals("red")) //过滤出红色的苹果 .peek(appleStore -> System.out.println(appleStore)) //到第二个节点只有红色苹果的数据了 .toArray(); } AppleStore(id=1, color=red, weight=1.2, origin=重庆) AppleStore(id=2, color=red, weight=1.5, origin=四川) AppleStore(id=5, color=red, weight=3.2, origin=杭州)

3.3.2、转换:map(Function



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有