java8 stream常用方法总结

Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作。

一、流的初始化与转换:

Java中的Stream的所有操作都是针对流的,所以,使用Stream必须要得到Stream对象:

1、初始化一个流:

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

2、数组转换为一个流:

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

或者

stream = Arrays.stream(strArray); 

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

List<String> list = Arrays.asList(strArray); 
stream = list.stream(); 

二、流的操作:

流的操作可以归结为几种:

1、遍历操作(map):

使用map操作可以遍历集合中的每个对象,并对其进行操作,map之后,用.collect(Collectors.toList())会得到操作后的集合。

1.1、抽取map某个键对应的值组成新的List:

List<String> nameList = queryList.stream().map(m -> m.get("name")).collect(Collectors.toList());

1.2、遍历转换为大写:

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

1.3、平方数:

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

2、过滤操作(filter):

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

2.1、得到其中不为空的String

List<String> 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<String> forEachLists = new ArrayList<>(); 
forEachLists.add("a"); 
forEachLists.add("b"); 
forEachLists.add("c"); 
forEachLists.stream().forEach(s-> System.out.println(s));

4、返回特定的结果集合(limit/skip):

limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素:

List<String> forEachLists = new ArrayList<>(); 
forEachLists.add("a"); 
forEachLists.add("b"); 
forEachLists.add("c"); 
forEachLists.add("d"); 
forEachLists.add("e"); 
forEachLists.add("f"); 
List<String> 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<Integer> sortLists = new ArrayList<>(); 
sortLists.add(1); 
sortLists.add(4); 
sortLists.add(6); 
sortLists.add(3); 
sortLists.add(2); 
List<Integer> afterSortLists = sortLists.stream().sorted((In1,In2)->In1-In2).collect(Collectors.toList());

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

List<String> 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<String> distinctList = new ArrayList<>(); 
distinctList.add("a"); 
distinctList.add("a"); 
distinctList.add("c"); 
distinctList.add("d"); 
List<String> afterDistinctList = distinctList.stream().distinct().collect(Collectors.toList()); 

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

6、匹配(Match方法):

有的时候,我们只需要判断集合中是否全部满足条件,或者判断集合中是否有满足条件的元素,这时候就可以使用match方法:

  • allMatch:Stream 中全部元素符合传入的 predicate,返回 true
  • anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true
  • noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true

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

List<String> 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<String> 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

7、其他

7.1、取出学生列表中所有学生id和年龄对应map

Map<String, Integer> studentAgeMap = studentList.stream().collect(Collectors.toMap(Student::getId, Student::getAge));
// 上面代码key重复或者value为空时报错,建议改成:
Map<String, Integer> studentAgeMap = studentList.stream().collect(HashMap::new, (m, v) -> m.put(v.getId(), v.getAge()), HashMap::putAll);

7.2、取出学生列表中学生年龄对应的学生列表map

Map<Integer, List<Student>> ageListMap = studentList.stream().collect(Collectors.groupingBy(Student::getAge));

7.3、取出学生列表中每个年龄的计数map

Map<String, Long> ageCountMap = studentList.stream().collect(Collectors.groupingBy(Student::getAge, Collectors.counting()));

7.4、学生列表中年龄计数大于1组装成新的List(接7.3)

List<String> repeatList = ageCountMap.keySet().stream().filter(Student::getAge > 1).collect(Collectors.toList());

7.5、取出学生成绩列表中学生名字对应的所有英语成绩和(BigDecimal求和)

Map<String, BigDecimal> englishGardeMap = gardeList.stream().collect(Collectors.groupingBy(Garde::getStudentName, Collectors.reducing(BigDecimal.ZERO, Garde::getEnglishGarde, BigDecimal::add)));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值