JDK8新特性之Stream流详解

阅读: 评论:0

JDK8新特性之Stream流详解

JDK8新特性之Stream流详解

概念

Stream是Java8 API的新成员,它允许以声明性方式处理数据集合 。

Stream可以由数组或集合创建,对流的操作分为两种:

中间操作,每次返回一个新的流,可以有多个。
终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。
另外,Stream有几个特性:

stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。
stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。

流程

1)第一步:把集合转换为流stream
2)第二步:操作stream流
stream流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果

操作符

两种:中间操作符、终止操作符

中间操作符

流方法含义示例
filter用于通过设置的条件过滤出元素List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).List());
distinct返回一个元素各异(根据流所生成元素的hashCode和equals方法实现)的流。List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);numbers.stream().filter(i -> i % 2 == 0).distinct().forEach(System.out::println);
limit会返回一个不超过给定长度的流。List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");List<String> limited = strings.stream().limit(3).List());
skip返回一个扔掉了前n个元素的流。List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");List<String> skiped = strings.stream().skip(3).List());
map接受一个函数作为参数。这个函数会被应用到每个元素上,并将其映射成一个新的元素(使用映射一词,是因为它和转换类似,但其中的细微差别在于它是“创建一个新版本”而不是去“修改”)。List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");List<String> mapped = strings.stream().map(str->str+"-itcast").List());
flatMap使用flatMap方法的效果是,各个数组并不是分别映射成一个流,而是映射成流的内容。所有使用map(Arrays::stream)时生成的单个流都被合并起来,即扁平化为一个流。List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");Stream<Character> flatMap = strings.stream().flatMap(Java8StreamTest::getCharacterByString);
sorted返回排序后的流List<String> strings1 = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");List<String> sorted1 = strings1.stream().sorted().List());

示例代码:

1)filter

/*** 功能描述:根据条件过滤集合数据* @return : void
*/
@Test
public void filter(){List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).List());out.println(filtered);
}

2)distinct

/*** 功能描述:去除集合中重复数据* @return : void
*/
@Test
public void distinct(){List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");List<String> distincted = strings.stream().distinct().List());out.println(distincted);
}

3)limit

/*** 功能描述:指定获取集合前x条数据,重新构造一个新的集合* @return : void
*/
@Test
public void limit(){List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");List<String> limited = strings.stream().limit(3).List());out.println(limited);
}

4)skip

/*** 功能描述:排除集合前x条数据,把后面的数据重新构造一个新的集合* @return : void
*/
@Testpublic void skip(){List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");List<String> skiped = strings.stream().skip(3).List());out.println(skiped);
}

5)map

/*** 功能描述:对集合中所有元素统一处理* @return : void
*/
@Test
public void map(){List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");List<String> mapped = strings.stream().map(str->str+"-itcast").List());out.println(mapped);
}

6)flatMap

/*** 功能描述:对集合中所有元素统一处理* @return : void
*/
@Test
public void flatMap(){List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");Stream<String> stringStream = strings.stream().map(x -> x);Stream<String> stringStream1 = strings.stream().flatMap(x -> Arrays.asList(x.split(" ")).stream());
}

7)sorted

/*** 功能描述 : 对集合进行排序* @return : void
*/
@Test
public void sorted(){List<String> strings1 = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");List<String> strings2 = Arrays.asList("张三", "李四", "王五", "赵柳", "张哥","李哥", "王哥");List<Integer> strings3 = Arrays.asList(10, 2, 30, 22, 1,0, -9);List<String> sorted1 = strings1.stream().sorted().List());List<String> sorted2 = strings2.stream().Instance(Locale.CHINA))).List());List<Integer> sorted3 = strings3.stream().sorted().List());out.println(sorted1);out.println(sorted2);out.println(sorted3);
}

 

终止操作符

流方法含义示例
anyMatch检查是否至少匹配一个元素,返回boolean。List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");boolean b = strings.stream().anyMatch(s -> s == "abc");
allMatch检查是否匹配所有元素,返回boolean。List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");boolean b = strings.stream().allMatch(s -> s == "abc");
noneMatch检查是否没有匹配所有元素,返回boolean。List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");boolean b = strings.stream().noneMatch(s -> s == "abc");
findAny将返回当前流中的任意元素。List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");Optional<String> any = strings.stream().findAny();
findFirst返回第一个元素List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");Optional<String> first = strings.stream().findFirst();
forEach遍历流List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");strings.stream().forEach(s -> out.println(s));
collect收集器,将流转换为其他形式。List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");Set<String> set = strings.stream().Set());List<String> list = strings.stream().List());Map<String, String> map = strings.stream().Map(v -&at("_name"), v1 -> v1, (v1, v2) -> v1));
reduce可以将流中元素反复结合起来,得到一个值。List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");Optional<String> reduce = strings.stream().reduce((acc,item) -> {return acc+item;});if(reduce.isPresent())out.());
count返回流中元素总数。List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");long count = strings.stream().count();

示例代码

1)anyMatch

/*** 功能描述 : 判断集合中是否至少存在一个元素满足条件* @return : void
*/
@Test
public void anyMatch(){List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");boolean b = strings.stream().anyMatch(s -> s == "abc");out.println(b);
}

2)allMatch

/*** 功能描述 : 判断集合中是否所有元素都满足条件* @return : void
*/
@Test
public void allMatch(){List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");boolean b = strings.stream().allMatch(s -> s == "abc");out.println(b);
}

3)noneMatch

/*** 功能描述 : 判断集合中是否所有元素都不满足条件* @return : void
*/
@Test
public void noneMatch(){List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");boolean b = strings.stream().noneMatch(s -> s == "abc");out.println(b);
}

4)findAny

/*** 功能描述 : 返回当前流中任意元素* @return : void
*/
@Test
public void findAny(){List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");Optional<String> any = strings.stream().findAny();if(any.isPresent()) out.());
}

5)findFirst

/*** 功能描述 : 返回当前流中第一个元素* @return : void
*/
@Test
public void findFirst(){List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");Optional<String> first = strings.stream().findFirst();if(first.isPresent()) out.());
}

6)forEach java

/*** 功能描述 : 遍历流* @return : void
*/
@Test
public void foreach(){List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");strings.stream().forEach(s -> out.println(s));
}

7)collect

/*** 功能描述 : 流转换为其他形式* @return : void
*/
@Test
public void collect(){List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");Set<String> set = strings.stream().Set());List<String> list = strings.stream().List());Map<String, String> map = strings.stream().Map(v -&at("_name"), v1 -> v1, (v1, v2) -> v1));out.println(set);out.println(list);out.println(map);
}

8)reduce

/*** 功能描述 : 将流中元素反复结合起来,得到一个值* @return : void
*/
@Test
public void reduce(){List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");//reduce方法一Optional<String> reduce1 = strings.stream().reduce((acc,item) -> {return acc+item;});//reduce方法二String reduce2 = strings.stream().reduce("itcast", (acc, item) -> {return acc + item;});//reduce方法三ArrayList<String> reduce3 = strings.stream().reduce(new ArrayList<String>(),new BiFunction<ArrayList<String>, String, ArrayList<String>>() {@Overridepublic ArrayList<String> apply(ArrayList<String> acc, String item) {acc.add(item);return acc;}}, new BinaryOperator<ArrayList<String>>() {@Overridepublic ArrayList<String> apply(ArrayList<String> acc, ArrayList<String> item) {return acc;}});if(reduce1.isPresent())out.());out.println(reduce2);out.println(reduce3);
}

9)count

/**
* 功能描述 : 返回流中元素总数
* @return : void
*/
@Test
public void count(){List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl");long count = strings.stream().count();out.println(count);
}

本文发布于:2024-02-04 07:53:26,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170702412653687.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:详解   新特性   Stream
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23