Java8新特性

您所在的位置:网站首页 jvm18新特性 Java8新特性

Java8新特性

2024-07-15 05:58| 来源: 网络整理| 查看: 265

文章目录 简介Stream 的特性创建Stream通过集合创建流通过数组创建流通过Stream.of方法创建流创建规律的无限流创建无限流创建空流 Stream操作分类中间操作无状态filtermapflapMap 有状态distinctsortedsortedreversedthenComparing limitskipconcat 终结操作非短路操作forEachreducecollecttoList,toSet,toSetgroupingBypartitioningBy max、mincountsummaryStatistics 短路操作anyMatchfindFirstfindAny Optional类型原始类型流并行流并行流的执行顺序sorted()、distinct()等对并行流的影响 总结Stream 详解Collect 详解

简介

Stream 作为 Java8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念,Stream 是对集合的包装,通常和lambda一起使用。使用stream可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。

Stream 的特性

Stream 主要具有如下三点特性

stream不存储数据

stream不改变源数据

stream的延迟执行特性

通常我们在数组或集合的基础上创建stream,stream不会专门存储数据,对stream的操作也不会影响到创建它的数组和集合,对于stream的聚合、消费或收集操作只能进行一次,再次操作会报错

@Test public void test1(){ int[] arr = new int[]{1, 2, 3}; IntStream intStream = Arrays.stream(arr); intStream.forEach(System.out::println); intStream.forEach(System.out::println); }

输出结果

1 2 3 java.lang.IllegalStateException: stream has already been operated upon or closed

stream的操作是延迟执行的,在列出字符串长度大于3的例子中,在collect方法执行之前,filter、sorted、map方法还未执行,只有当collect方法执行时才会触发之前转换操作

public boolean filter(String s) { System.out.println("begin compare"); return s.length() > 3; } @Test public void test2() { List strs = new ArrayList() { { add("abc"); add("abcd"); } }; Stream stream = strs.stream().filter(this::filter); System.out.println("split-------------------------------------"); List list = stream.collect(Collectors.toList()); System.out.println(list); }

打印结果如下:

split------------------------------------- begin compare begin compare [abcd]

由此可以看出,在执行完filter时,没有实际执行filter中的方法,而是等到执行collect时才会执行,即是延迟执行的。

注意:

由于stream的延迟执行特性,在聚合操作执行前修改数据源是允许的。当我们操作一个流的时候,并不会修改流底层的集合(即使集合是线程安全的),如果想要修改原有的集合,就无法定义流操作的输出。 /** * 延迟执行特性,在聚合操作之前都可以添加相应元素 */ @Test public void test3() { List wordList = new ArrayList() { { add("a"); add("b"); } }; Stream words = wordList.stream(); wordList.add("END"); long n = words.distinct().count(); System.out.println(n); }

输出结果

3

延迟执行特性,会产生干扰

@Test public void test4(){ List wordList = new ArrayList() { { add("a"); add("b"); } }; Stream words1 = wordList.stream(); words1.forEach(s -> { System.out.println("s->"+s); if (s.length() a select->a [b] s->null java.lang.NullPointerException 创建Stream

要进行流操作首先要获取流,有6中方法可以获取流。

通过集合创建流 @Test public void testCollectionStream() { List strs = Arrays.asList("a", "b", "c", "d"); //创建普通流 Stream stream = strs.stream(); //创建并行流(即多个线程处理) // Stream stream1 = strs.parallelStream(); stream.forEach(System.out::println); }

输出结果

a b c d 通过数组创建流 @Test public void testArrayStream() { int[] arr = new int[]{1, 2, 3, 4}; IntStream intStream = Arrays.stream(arr); intStream.forEach(System.out::println); System.out.println("========"); Integer[] arr2 = new Integer[]{1, 2, 3, 4}; Stream stream = Arrays.stream(arr2); stream.forEach(System.out::println); }

输出结果

1 2 3 4 ======== 1 2 3 4 通过Stream.of方法创建流 @Test public void testStreamOf() { Stream stream = Stream.of(1, 2, 3); stream.forEach(System.out::println); }

输出结果

1 2 3 创建规律的无限流 @Test public void testUnlimitStream() { Stream stream = Stream.iterate(0, x -> x + 2).limit(3); stream.forEach(System.out::println); }

输出结果

0 2 4 创建无限流 @Test public void testUnlimitStream2() { Stream stream = Stream.generate(() -> "number" + new Random().nextInt()).limit(3); stream.forEach(System.out::println); }

输出结果

number1042047526 number-155761434 number-1605164634 创建空流 @Test public void testEmptyStream() { Stream stream = Stream.empty(); stream.forEach(System.out::println); } Stream操作分类 中间操作又可以分为无状态(Stateless)与有状态(Stateful)操作, 无状态是指元素的处理不受之前元素的影响,有状态是指该操作只有拿到所有元素之后才能继续下去。 终结操作又可以分为短路(Short-circuiting)与非短路(Unshort-circuiting)操作, 短路是指遇到某些符合条件的元素就可以得到最终结果,非短路是指必须处理完所有元素才能得到最终结果。 我们通常还会将中间操作称为懒操作,也正是由这种懒操作结合终结操作、数据源构成的处理管道(Pipeline),实现了 Stream 的高效。

中间操作 无状态 filter:过滤流,过滤流中的元素map:转换流,将一种类型的流转换为另外一种类型的流flapMap:拆解流,将流中每一个元素拆解成一个流 filter

filter接收一个Predicate函数接口参数,boolean test(T t);即接收一个参数,返回boolean类型。

@Test public void testFilter() { Integer[] arr = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; Arrays.stream(arr).filter(x -> x > 3 && x x.toLowerCase()).forEach(System.out::println); }

输出结果

yes yes no no flapMap

flatMap接收一个Function函数接口: Stream flatMap(Function



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3