java8集合流式操作
⼀、集合相关的中间操作和最终操作
中间操作:
filter():对元素进⾏过滤
sorted():对元素排序
map():元素映射
java arraylist用法distinct():去除重复的元素
最终操作:
forEach():遍历每个元素。
reduce():把Stream 元素组合起来。例如,字符串拼接,数值的 sum,min,max ,average 都是特殊的 reduce。
collect():返回⼀个新的集合。
min():到最⼩值。
max():到最⼤值。
3.1 filter() 对元素进⾏过滤
Demo(有⼀链表,{1,2,3,4,5},把偶数过滤掉):
package com.dxz.study.jdk8;
import java.util.ArrayList;
import java.util.List;
public class Stream {
public static void main(String[] args) throws InterruptedException {
List list = new ArrayList();
for(int i = 1 ; i <= 5; ++i){
list.add(i);
}
list.stream().filter(param -> (int)param % 2 == 1)
.forEach(System.out::println);
}
}
输出:
1
3
5
3.2 sorted() 对元素进⾏排序
Demo(有⼀链表,{2,3,1,5,4},从⼩到⼤排序):
public static void sorted() {
List list = new ArrayList();
list.add(2);
list.add(3);
list.add(1);
list.add(5);
list.add(4);
list.stream().sorted().forEach(System.out::println);
}
输出:
1
2
3
4
5
Ps1:此时为升序,那么有时候我们可能会需要到降序,此时做法可以如下:
流除了提供默认的升序 sorted() ⽅法,也提供了:
Stream<T> sorted(Comparator<? super T> comparator);
那么,⾃定义⽐较函数即可,如下代码:
public static void test2() {
List list = new ArrayList();
list.add(2);
list.add(3);
list.add(1);
list.add(5);
list.add(4);
//      list.stream().sorted().forEach(System.out::println);
list.stream().sorted( (param1,param2) -> ((int)param1 < (int)param2 ? 1 : -1 ) )                  .forEach(System.out::println);
}
输出为:
5
4
3
2
1
3.3 map() 元素映射
也就是说,原来的链表的每个元素可以按照规则变成相应的元素。Demo(链表 (1,0),变成 true,false):
public static void test3() {
List list = new ArrayList();
list.add(1);
list.add(0);
list.stream().map( param -> (int)param == 1 ? true:false )
.forEach(System.out::println);
}
输出:
true
false
我们先给map添加⼏个值:
Map<String, String> someMap = new HashMap<>();
someMap.put("jack","20");
someMap.put("bill","35");
上⾯我们添加了name和age字段。
如果我们想查age=20的key,则可以这样做:
public class MapTest {
public static void main(String[] args) {
Map<String, String> someMap = new HashMap<>();
someMap.put("jack","20");
someMap.put("bill","35");
Optional<String> optionalName = Set().stream()
.filter(e -> "20".Value()))
.map(Map.Entry::getKey)
.findFirst();
System.out.());
}
}
结果:
jack
因为返回的是Optional,如果值不存在的情况下,我们也可以处理:
optionalName = Set().stream()
.filter(e -> "Non ages".Value()))
.map(Map.Entry::getKey).findFirst();
System.out.println(optionalName.isPresent());
上⾯的例⼦我们通过调⽤isPresent来判断age是否存在。
如果有多个值,我们可以这样写:
someMap.put("alice","20");
List<String> listnames = Set().stream()
.
filter(e -> e.getValue().equals("20"))
.map(Map.Entry::getKey)
.List());
System.out.println(listnames);
上⾯我们调⽤了List())将值转成了List。
结果:
[alice, jack]
上⾯我们获取的map的key,同样的我们也可以获取map的value:
List<String> listAges = Set().stream()
.filter(e -> e.getKey().equals("alice"))
.map(Map.Entry::getValue)
.
List());
System.out.println(listAges);
上⾯我们匹配了key值是alice的value。
结果:
[20]
3.4  distinct() 去除重复元素
Demo:
public static void test4() {
List list = new ArrayList();
list.add(1);
list.add(1);
list.add(0);
list.stream().distinct().forEach(System.out::println);
}
1
3.5 reduce() :把Stream 元素组合起来。
Demo(从1加到5):
public static void test5() {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println(list.stream().reduce((param1, param2) -> (int) param1 + (int) param2).get());
}
15
注意,reduce() 返回⼀个 Optional 类型的对象,可以通过 get() ⽅法获得值。
3.6 collect() :返回⼀个新的集合
Demo(先把 list 集合的奇数去掉,然后把剩下的偶数返回到 _list 集合中):
public static void test6() {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
List _list = (List) list.stream().filter((param) -> (int) param % 2 == 0).List());
_list.forEach(System.out::println);
}
输出:
2
4
3.7 min(),max()  到最⼤值最⼩值
public static void test7() {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println(list.stream().min((param1, param2) -> (int) param1 > (int) param2 ? 1 : -1).get());        System.out.println(list.stream().max((param1, param2) -> (int) param1 > (int) param2 ? 1 : -1).get());
}
结果
1
5
注意, min(),max() ⽅法也是返回 Optional 对象,可以通过 get() ⽅法返回值。
总结:
1. 流式操作的引⼊:提⾼执⾏效率(并⾏),⽅便编码(有很多API 可⽤),提⾼可读性。
2. 流的分类:可以分为串⾏流和并⾏流;对于操作:可以分为中间操作和最终操作
3. 流API:
中间操作:
filter():对元素进⾏过滤;
sorted():对元素排序;
map():元素映射;
distinct():去除重复的元素。
最终操作:
forEach():遍历每个元素;
reduce():把Stream 元素组合起来。例如,字符串拼接,数值的 sum,min,max ,average 都是特殊的 reduce。                collect():返回⼀个新的集合。
min():到最⼩值。
max():到最⼤值。
参考:
1. Java 8 新特性概述:
2. Java 8 中的Stream API 详解:

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