延迟执行与不可变,系统讲解JavaStream数据处理_【快资讯】
17Cats Lv11

图片模式

转换流操作:例如filter和map方法,将一个Stream转换成另一个Stream,返回值都是Stream。

终结流操作:例如count和collect方法,将一个Stream汇总为我们需要的结果,返回值都不是Stream。

无状态:即此方法的执行无需依赖前面方法执行的结果集。

有状态:即此方法的执行需要依赖前面方法执行的结果集。

ListInteger list = List.of(1, 2, 3); ListInteger filterList = new ArrayList();
for (Integer i : list) { if (i 2) { filterList.add(i); } }
System.out.println(filterList);

ListInteger list = List.of(1, 2, 3); ListInteger filterList = new ArrayList();
for (Integer i : list) { if (i 2 i 10 (i % 2 == 0)) { filterList.add(i); } }
System.out.println(filterList);

ListInteger list = List.of(1, 2, 3).stream() .filter(i - i 2) .filter(i - i
10) .filter(i - i % 2 == 0) .collect(toList());

ListInteger list = List.of(1, 2, 3).stream() .filter(i - i 2) .filter(i - i
10) .filter(i - i % 2 == 0) .collect(toList());

由于每次Stream操作都会生成一个新的Stream,所以Stream是不可变的,就像String。

在Stream中只保存原集合的引用,所以在进行一些会修改元素的操作时,是通过原元素生成一份新的新元素,所以Stream 的任何操作都不会影响到原对象。

List.of(1, 2, 3).stream() .filter(i - i 2) .peek(System.out::println);

List.of(1, 2, 3).stream() .filter(i - i 2) .peek(System.out::println)
.count();

使用Steam接口创建

通过集合类库创建

public static Stream of(T… values) { return Arrays.stream(values); }

StreamInteger integerStream = Stream.of(1, 2, 3); StreamDouble doubleStream =
Stream.of(1.1d, 2.2d, 3.3d); StreamString stringStream = Stream.of("1",
"2", "3");

StreamInteger integerStream = Stream.of(1, 2, 3);

StreamObject empty = Stream.empty();

public static Stream generate(Supplier? extends T s) {
Objects.requireNonNull(s); return StreamSupport.stream( new
StreamSpliterators.InfiniteSupplyingSpliterator.OfRef(Long.MAX_VALUE, s),
false); }

StreamString generate = Stream.generate(() - "Supplier"); StreamInteger
generateInteger = Stream.generate(() -

StreamInteger integerStreamList = List.of(1, 2, 3).stream(); StreamString
stringStreamList = List.of("1", "2", "3").stream();

StreamInteger listStream = List.of(1, 2, 3).stream(); StreamInteger setStream
= Set.of(1, 2, 3).stream();

default Stream stream() { return StreamSupport.stream(spliterator(), false); }

StreamInteger integerParallelStream = Stream.of(1, 2, 3).parallel();
StreamString stringParallelStream = Stream.of("1", "2", "3").parallel();
StreamInteger integerParallelStreamList = List.of(1, 2, 3).parallelStream();
StreamString stringParallelStreamList = List.of("1", "2",
"3").parallelStream();

default Stream stream() { return StreamSupport.stream(spliterator(), false); }
default Stream parallelStream() { return StreamSupport.stream(spliterator(),
true); }

Stream.of(1, 2, 3).parallel().sequential();

StreamInteger concat = Stream .concat(Stream.of(1, 2, 3), Stream.of(4, 5, 6));

StreamInteger integerStream = Stream.of(1, 2, 3); StreamString stringStream =
Stream.of("1", "2", "3"); Stream? extends Serializable stream =
Stream.concat(integerStream, stringStream);

图片模式

map()方法:此方法的参数是一个Function对象,它可以使你对集合中的元素做自定义操作,并保留操作后的元素。

filter()方法:此方法的参数是一个Predicate对象,Predicate的执行结果是一个Boolean类型,所以此方法只保留返回值为true的元素,正如其名我们可以使用此方法做一些筛选操作。

flatMap()方法:此方法和map()方法一样参数是一个Function对象,但是此Function的返回值要求是一个Stream,该方法可以将多个Stream中的元素聚合在一起进行返回。

StreamInteger integerStreamList = List.of(1, 2, 3).stream(); StreamInteger
mapStream = integerStreamList.map(i - i * 10);

图片模式

StreamInteger integerStreamList = List.of(1, 2, 3).stream(); StreamInteger
filterStream = integerStreamList.filter(i - i

图片模式

ListOrder orders = List.of(new Order(), new Order()); StreamItem itemStream =
orders.stream() .flatMap(order - order.getItemList().stream());

图片模式

Stream peek(Consumer? super T action);

StreamInteger peekStream = integerStreamList.peek(i - System.out.println(i));

List.of(1, 2, 3).stream() .map(i - i * 10) .peek(System.out::println)
.count();

mapToInt

mapToLong

mapToDouble

flatMapToInt

flatMapToLong

flatMapToDouble

mapToInt返回值为IntStream

mapToLong返回值为LongStream

mapToDouble返回值为DoubleStream

flatMapToInt返回值为IntStream

flatMapToLong返回值为LongStream

flatMapToDouble返回值为DoubleStream

IntStream:对应基础数据类型中的int、short、char、boolean

LongStream:对应基础数据类型中的long

DoubleStream:对应基础数据类型中的double和float

ListInteger list = List.of(1, 2, 3).stream() .map(i - i * 10) .filter(i - i
10) .filter(i - i % 2 == 0) .collect(toList());

不可变:不影响原集合,每次调用都返回一个新的Stream。

延迟执行:在遇到终结操作之前,Stream不会执行。

同时,本文在写作过程中也参考了以下书籍:

写给大忙人看的Java SE 8

Java 8 函数式编程

Java 8 实战

这三本书都非常好,第一本是Java核心技术的作者写的,如果你想全面的了解JDK8的升级可以看这本。

第二本可以说是一个小册子,只有一百多页很短,主要讲了一些函数式的思想。

如果你只能看一本,那么我这里推荐第三本,豆瓣评分高达9.2,内容和质量都当属上乘。