Java8新特性:使用Stream优化对集合的操作(知识)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29229567/article/details/83900466

Java8新特性:使用Stream优化对集合的操作(知识)

Java8中提供了Stream对集合操作作出了极大的简化,Stream的常用操作分类如下:
在这里插入图片描述
如上图所示,Stream中的操作可以分为两大类:中间操作与结束操作。
中间操作只是对操作进行了记录,只有结束操作才会触发实际的计算(即惰性求值),这也是Stream在迭代大集合时高效的原因之一。中间操作又可以分为无状态(Stateless)操作与有状态(Stateful)操作,前者是指元素的处理不受之前元素的影响;后者是指该操作只有拿到所有元素之后才能继续下去。结束操作又可以分为短路与非短路操作,前者是指遇到某些符合条件的元素就可以得到最终结果;而后者是指必须处理所有元素才能得到最终结果。

一、流的初始化与转换
Java中的Stream的所有操作都是针对流的,所以,使用Stream必须要得到Stream对象:
1、初始化一个流:

Stream stream = Stream.of("a", "b", "c");  

2、数组转换为一个流:

String [] strArray = new String[] {"a", "b", "c"};   
	
	Stream stream = Stream.of(strArray);    
或者    
    Stream stream = Arrays.stream(strArray);  

3、集合对象转换为一个流(Collections):

List list = Arrays.asList(strArray);    

Stream stream = list.stream();

二、流的操作:
流的操作可以归结为几种:
1、遍历操作(map):使用map操作可以遍历集合中的每个对象,并对其进行操作,map之后,用.collect(Collectors.toList())会得到操作后的集合。

1.1、遍历转换为大写:

 List output = wordList.stream().map(String::toUpperCase).collect(Collectors.toList());                                                              

1.2、平方数:

List nums = Arrays.asList(1, 2, 3, 4);   
List squareNums = nums.stream().map(n -> n * n). collect(Collectors.toList());

2、过滤操作(filter):使用filter可以对象Stream中进行过滤,通过测试的元素将会留下来生成一个新的Stream。

2.1、得到其中不为空的String

List filterLists = new ArrayList<();
	filterLists.add("");filterLists.add("a");filterLists.add("b");
List afterFilterLists = filterLists.stream().filter(s -> !s.isEmpty()).collect(Collectors.toList());

3、循环操作(forEach):如果只是想对流中的每个对象进行一些自定义的操作,可以使用forEach:

List forEachLists= new ArrayList<();
	forEachLists.add("");forEachLists.add("a");forEachLists.add("b");
forEachLists.stream().forEach(s-> System.out.println(s));

4、返回特定的结果集合(limit/skip):limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素

List forEachLists = new ArrayList<();
	forEachLists.add("a");forEachLists.add("b");forEachLists.add("c");
	forEachLists.add("d");forEachLists.add("e");forEachLists.add("f");
List limitLists = forEachLists.stream().skip(2).limit(3).collect(Collectors.toList());

【 注意】skip与limit是有顺序关系的,比如使用skip(2)会跳过集合的前两个,返回的为c、d、e、f,然后调用limit(3)会返回前3个,所以最后返回的c,d,e。

5、排序(sort/min/max/distinct):sort可以对集合中的所有元素进行排序。max,min可以寻找出流中最大或者最小的元素,而distinct可以寻找出不重复的元素:

5.1、对一个集合进行排序:

List sortLists = new ArrayList<>();    
	sortLists.add(1);sortLists.add(4);sortLists.add(6);sortLists.add(3);sortLists.add(2);
List afterSortLists = sortLists.stream().sorted((In1,In2)->In1-In2).collect(Collectors.toList());

5.2、得到其中长度最大的元素:

List maxLists = new ArrayList<>();
	maxLists.add("a");maxLists.add("b");maxLists.add("c");
	maxLists.add("d");maxLists.add("e");maxLists.add("f");maxLists.add("hahaha");
int maxLength = maxLists.stream().mapToInt(s->s.length()).max().getAsInt();
System.out.println("字符串长度最长的长度为"+maxLength);

5.3、对一个集合进行查重:

List distinctList = new ArrayList<>();        
	distinctList.add("a");distinctList.add("a");distinctList.add("c");distinctList.add("d");
List afterDistinctList = distinctList.stream().distinct().collect(Collectors.toList());

其中的distinct()方法能找出stream中元素equal(),即相同的元素,并将相同的去除,上述返回即为a,c,d。

6、匹配(Match方法):有的时候,我们只需要判断集合中是否全部满足条件,或者判断集合中是否有满足条件的元素,这时候就可以使用match方法。
      allMatch:Stream 中全部元素符合传入的 predicate,返回 。
      trueanyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true。
      noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true。

6.1、判断集合中有没有为‘c’的元素:

List matchList = new ArrayList<>();            	
	matchList.add("a");matchList.add("a");matchList.add("c");matchList.add("d");
boolean isExits = matchList.stream().anyMatch(s -> s.equals("c"));

6.2、判断集合中是否全不为空:

 List matchList = new ArrayList<>();
	matchList.add("a");matchList.add("");matchList.add("a");
	matchList.add("c");matchList.add("d");
boolean isNotEmpty = matchList.stream().noneMatch(s -> s.isEmpty());

则返回的为false。

猜你喜欢

转载自blog.csdn.net/qq_29229567/article/details/83900466