package com.company.bsearch.jdk8;
/**
* @author huoziyang
* @version 1.0
* @date 2021/6/15 10:47
*/
public class User {
private int id;
private String name;
private int age;
private Double height;
public User(int id, String name, int age, Double height) {
this.id = id;
this.name = name;
this.age = age;
this.height = height;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Double getHeight() {
return height;
}
public void setHeight(Double height) {
this.height = height;
}
}
package com.company.bsearch.jdk8;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author huoziyang
* @version 1.0
* @date 2021/6/15 10:49
*/
public class StreamApiDemo {
public static void main(String[] args) {
List<User> users = Arrays.asList(new User(1, "zhangsan", 38, 172.5),
new User(2, "lisi", 38, 180.0),
new User(3, "wangwu", 25, 185.0),
new User(4, "maliu", 25, 180.0),
new User(5, "zhouwu", 30, 170.0));
System.out.println("------------------filter操作-----------------------------------------");
// 筛选出年龄大于18岁的人
List<User> ageBigThan18 = users.stream().filter(user -> user.getAge() > 18).collect(Collectors.toList());
ageBigThan18.forEach(System.out::println);
// 筛选出年龄大于18且身高高于170的人
users.stream().filter(user -> user.getAge() > 18).filter(user -> user.getHeight() > 170).forEach(System.out::println);
// 筛选出年龄等于18且身高大于180的人
users.stream().filter(user -> user.getAge() == 18).filter(user -> user.getHeight() > 180).forEach(System.out::println);
System.out.println("------------------sorted操作-----------------------------------------");
users.forEach(System.out::println);
// 按照身高逆序排序
users.stream().sorted(Comparator.comparingDouble(User::getAge).reversed()).collect(Collectors.toList()).forEach(System.out::println);
// 先按年龄排序,然后按照身高排序
users.stream().sorted(Comparator.comparingInt(User::getAge).thenComparingDouble(User::getHeight)).collect(Collectors.toList()).forEach(System.out::println);
System.out.println("-----------------------map操作------------------------------------");
// 取最大值、最小值等操作:max,min,sum
int maxAge = users.stream().mapToInt(User::getAge).max().getAsInt();
User maxAgeUser = users.stream().max(Comparator.comparingInt(User::getAge)).get();
// 找到年龄大于25岁的所有人的名字,并将所有人按照年龄排序
users.stream().filter(user -> user.getAge() > 25).
sorted(Comparator.comparingInt(User::getAge))
.map(User::getName)
.collect(Collectors.toList()).
forEach(System.out::println);
// 找到年龄大于25岁的所有人的身高,并将所有人分别按照身高、年龄排序
// 此时只能先排序然后在使用map拿到对应的人的身高,不然先拿到人的身高的集合再去排序,此时集合只有身高,变不能进行排序
users.stream().filter(user -> user.getAge() > 25).sorted(Comparator.comparingInt(User::getAge)
.thenComparingDouble(User::getHeight)).map(User::getHeight).collect(Collectors.toList()).forEach(System.out::println);
System.out.println("-----------------------8888888888------------------------------------");
users.stream().limit(2).collect(Collectors.toList()).forEach(System.out::println);
System.out.println("-----------------------999999999------------------------------------");
users.stream().skip(2).collect(Collectors.toList()).forEach(System.out::println);
// 还有distinct操作,这里不方便演示
System.out.println("-----------------------101010101010------------------------------------");
users.stream().map(User::getAge).forEach(System.out::println);
System.out.println("-----------------------111111111111111------------------------------------");
System.out.println("-----------------------查找和匹配allMatch、 anyMatch、 noneMatch、 findFirst和findAny------------------------------------");
// //判断集合中是否有任何符合条件的元素 终端操作返回boolean
boolean b = users.stream().anyMatch(user -> user.getAge() > 100);
System.out.println(b);
System.out.println(users.stream().allMatch(user -> user.getAge() > 20));
System.out.println(users.stream().noneMatch(user -> user.getAge() > 100));
//你可能会想,为什么会同时有findFirst和findAny呢?答案是并行。找到第一个元素
// 在并行上限制更多。如果你不关心返回的元素是哪个,请使用findAny,因为它在使用并行流
// 时限制较少。
System.out.println(users.stream().filter(user -> user.getAge() > 25).findAny());
System.out.println(users.stream().filter(user -> user.getAge() > 25).findFirst());
System.out.println("------------规约reduce----------------");
/*
规约的使用规则:从第一个参数开始参加计算
*/
List<Integer> integers = Arrays.asList(2, 0, 4, 5, 3, 1);
Integer reduce = integers.stream().reduce(0, Integer::sum);
System.out.println(reduce);
System.out.println(integers.stream().reduce(-10, Integer::sum));
System.out.println(integers.stream().reduce(11, Integer::compareTo));
// 求最大值最小值
System.out.println(integers.stream().reduce(Integer::max).get());
System.out.println(integers.stream().reduce(Integer::min).get());
System.out.println(integers.stream().reduce((a, b1) -> a < b1 ?a : b1).get());
// 对基本数据类型进行装箱boxed
integers.stream().mapToInt(i -> i * 2).boxed().collect(Collectors.toList()).forEach(System.out::println);
// 求users中身高的个数
System.out.println("求users中身高的个数: "+users.stream().map(h -> 1).reduce(Integer::sum).get());
// 对所有的人员的id求和
System.out.println("对所有的人员的id求和: "+ users.parallelStream().map(User::getId).reduce(0, Integer::sum));
System.out.println("--------------------groupBy按照某个属性进行分组----------------");
// 按照年龄分组
System.out.println("按照年龄分组: "+users.stream().collect(Collectors.groupingBy(User::getAge)));
Map<Integer, Double> collect = users.stream().collect(Collectors.groupingBy(User::getAge, Collectors.averagingDouble(User::getHeight)));
collect.forEach((k, v) -> System.out.println("key:" + k + ", value:" + v));
// 按照年龄分组,求该组中人员的id之和
Map<Integer, Integer> collect1 = users.stream().collect(Collectors.groupingBy(User::getAge, Collectors.summingInt(User::getId)));
collect1.forEach((k, v) -> System.out.println("key:" + k + ", value:" + v));
// 按照 年龄分组,求该组中的数据个数
Map<Integer, Long> collect2 = users.stream().collect(Collectors.groupingBy(User::getAge, Collectors.counting()));
collect2.forEach((k, v) -> System.out.println("key:" + k + ", value:" + v));
List<Integer> list = new ArrayList<>();
list.add(1);
Optional.ofNullable(list).map(l -> l.get(0)).orElseGet(() -> 1);
Optional.of(list).isPresent();
}
}