Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream的方法
1.stream
-
stream() − 为集合创建串行流。
List<String> filtered = strings.stream().
filter(string -> !string.isEmpty()).collect(Collectors.toList());
.filter用于数据过滤
.collection用于结果的收集
Collectors 收集器将流转换成集合和聚合元素
2.forEach
-
forEach() − 用来迭代流中的每个数据。
Random random = new Random();
random.ints().forEach(System.out::println);
3.map
-
map() − 用于映射每个元素到对应的结果。
例一.输出平方去重运算
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
// 获取对应的平方数
//squaresList 的类型取决的map转换后的结果类型
List<Integer> squaresList = numbers.stream()
.map( i -> i*i).distinct().collect(Collectors.toList());
numbers.stream().map(i -> i * i).distinct()
.collect(Collectors.toList()).forEach(System.out::println);
.distinct 用于数据去重
例二.转换成符合要求的bool列表
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
List<Boolean> boolList = numbers.stream()
.map(it -> it > 5 ? true : false)
.collect(Collectors.toList());
4.filter
-
filter() − 用于通过设置的条件过滤出元素。
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
long count = strings.stream().filter(string -> string.isEmpty()).count();
Random random = new Random();
random.ints().filter(q -> q > 0).limit(10).sorted().forEach(System.out::println);
.limit 用于获取指定数量的流
5.limit
-
limit() − 用于获取指定数量的流。
Random random = new Random();
//输出十条大于零的随机数,并排序
random.ints().filter(q -> q > 0).limit(10).sorted().forEach(System.out::println);
6.sorted
-
sorted() − 用于对流进行排序。
sort默认顺序为升序
Random random = new Random();
//输出十条大于零的随机数,并排序
random.ints().filter(q -> q > 0).limit(10).sorted().forEach(System.out::println);
也可以用lambada 来创建一个Comparator
实例
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
//自然序排序一个list
numbers.stream().sorted();
//自然序逆序元素,使用Comparator 提供的reverseOrder() 方法
numbers.stream().sorted(Comparator.reverseOrder());
// 使用Comparator 来排序一个list
list.stream().sorted(Comparator.comparing(Student::getAge));
// 颠倒使用Comparator 来排序一个list的顺序,使用Comparator 提供的reverseOrder() 方法
list.stream().sorted(Comparator.comparing(Student::getAge).reversed());
//先通过age降序排序再通过姓名降序排序
list.stream().sorted(Comparator.comparing(Student::getAge).reversed().thenComparing(Student::getName));
7.Collectors
-
Collectors() − 实现了很多归约操作,例如将流转换成集合和聚合元素。
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println("筛选列表: " + filtered);
//字符串合并
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);
代码实例
1.
//通过name字段进行分组
Map<String,List<Test>> map = serverList.stream().collect(Collectors.groupingBy(Test::getName))
//将分组后的map转为List
List<Test> responses = map.entrySet().stream().sorted(Comparator.comparing(e->e.getKey()))
.map(e->new Test(e.getKey(),e.getValue())).collect(Collectors.toList());
2.
//filter中的表达式
objects.stream().filter(value -> {
if (value == 1 && value == null) {
return false;
}
return true;
}).collect(Collectors.toList());