//生成流
Stream<Integer> integerStream = Stream.of(1, 2, 3);
Stream<Integer> stream = Arrays.stream(new Integer[]{2, 1, 3});
map方法–获取集合中每一个元素中的一个字段的值
List<User> lst=new ArrayList<>();
User user02=new User();
user02.setId(2);
user02.setUserName("2");
user02.setPassword("2");
lst.add(user02);
User user01=new User();
user01.setId(1);
user01.setUserName("1");
user01.setPassword("1");
lst.add(user01);
List<String> lst02=lst.stream().map(User::getPassword).collect(Collectors.toList());
System.out.println(lst02);
也可以改变集合中每一个元素的值
如下将集合中的每一个数乘以2
List<Integer> lst=new ArrayList<>();
lst.add(1);
lst.add(2);
lst.add(3);
lst.stream().map(i -> i * 2).forEach(i->System.out.println(i));
List<Integer> collect = lst.stream().map(i -> i * 2).collect(Collectors.toList());
System.out.println(collect);
分组,如下根据userName进行分组
List<User> lst=new ArrayList<>();
User user01=new User();
user01.setId(1);
user01.setUserName("name1");
lst.add(user01);
User user02=new User();
user02.setId(2);
user02.setUserName("name2");
lst.add(user02);
User user03=new User();
user03.setId(3);
user03.setUserName("name2");
lst.add(user03);
Map<String, List<User>> groupList = lst.stream().collect(Collectors.groupingBy(User::getUserName));
for (Map.Entry<String,List<User>> entry:groupList.entrySet()){
System.out.println(entry.getKey()+"-"+entry.getValue());
}
分组、指定的字段合为Set
List<User> lst=new ArrayList<>();
lst.add(new User("u1", "p1"));
lst.add(new User("u1", "p2"));
lst.add(new User("u1", "p2"));
lst.add(new User("u2", "p1"));
lst.add(new User("u3", "p1"));
Map<String, Set<String>> map = lst.stream().collect(Collectors.groupingBy(User::getUserName,
Collectors.mapping(User::getPassword, Collectors.toSet())));
System.out.println(JSON.toJSONString(map));
根据多个字段分组
Map<String, List<User>> groupList = lst.stream()
.collect(Collectors.groupingBy(user->user.getId()+"_"+user.getUserName()));
System.out.println(JSONObject.toJSONString(groupList));
以及求每一组的最大的元素
List<User> lst=new ArrayList<>();
User user01=new User();
user01.setId(1);
user01.setUserName("name1");
lst.add(user01);
User user02=new User();
user02.setId(2);
user02.setUserName("name2");
lst.add(user02);
User user03=new User();
user03.setId(3);
user03.setUserName("name2");
lst.add(user03);
//分组求每一组最大的--参考https://www.jianshu.com/p/ea3875d14c47
Map<String, Optional<User>> dataList = lst.stream()
.collect(Collectors.groupingBy(User::getUserName,
Collectors.maxBy(Comparator.comparingInt(User::getId))));
for (Map.Entry<String, Optional<User>> entry:dataList.entrySet()){
System.out.println(entry.getKey()+"-"+JSONObject.toJSONString(entry.getValue().get()));
}
分组后求指定字段的和
Map<String, Integer> collect = lst.stream().collect(Collectors.groupingBy(User::getUserName,
Collectors.summingInt(User::getId)));
System.out.println(collect);
求和
List<Integer> l = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
Integer sum = l.stream().reduce(Integer::sum).orElse(0);
System.out.println(sum);
long sum1 = l.stream().collect(Collectors.summarizingInt(value -> value)).getSum();
System.out.println(sum1);
List<User> userList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setId(i);
user.setUserName("u" + i);
userList.add(user);
}
//求和
int sum = userList.stream().mapToInt(User::getId).sum();
System.out.println(sum);
求平均数
List<User> userList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setId(i);
user.setUserName("u" + i);
userList.add(user);
}
//求平均数
Double averaging = userList.stream().collect(Collectors.averagingInt(User::getId));
System.out.println(averaging);
转为key-value
Map<Integer, User> collect = lst.stream().collect(Collectors.toMap(User::getId, Function.identity()));
System.out.println(JSON.toJSONString(collect));
转map出现key重复,取第一个
@Test
public void test(){
List<User> userList=new ArrayList<>();
userList.add(new User(1, "u1-1"));
userList.add(new User(1, "u1-2"));
userList.add(new User(2, "u2"));
userList.add(new User(3, "u3"));
//出现id重复的,取第一个
Map<Integer, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (u1, u2) -> u1));
System.out.println(JSON.toJSONString(userMap));
}
sort–排序
class User{
private Integer id;
private Integer num;
public User(Integer id, Integer num) {
this.id = id;
this.num = num;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
}
List<User> lst=new ArrayList<>();
lst.add(new User(3,1));
lst.add(new User(1,1));
lst.add(new User(1,2));
lst.add(new User(2,3));
lst.add(new User(2,1));
//id升序,num降序
List<User> collect03 = lst.stream().sorted(Comparator.comparing(User::getId)
.thenComparing(User::getNum,Comparator.reverseOrder())).collect(Collectors.toList());
for (User user:collect03){
System.out.println(user.getId()+" "+user.getNum());
}
还有一种排序,排序出来有疑问,没磕出来
//这种有问题,结果见输出
List<User> collect01 = lst.stream().sorted(Comparator.comparing(User::getId).reversed()
.thenComparing(User::getNum).reversed()).collect(Collectors.toList());
for (User user:collect01){
System.out.println(user.getId()+" "+user.getNum());
}
System.out.println();
List<User> collect02 = lst.stream().sorted(Comparator.comparing(User::getId,Comparator.reverseOrder())
.thenComparing(User::getNum,Comparator.reverseOrder())).collect(Collectors.toList());
for (User user:collect02){
System.out.println(user.getId()+" "+user.getNum());
}
输出结果
1 2
1 1
2 3
2 1
3 1
3 1
2 3
2 1
1 2
1 1
一般用第二种。
两种排序参考
https://www.cnblogs.com/kuanglongblogs/p/11230250.html#commentform
stream
求数
//Stream
List<String> lst=new ArrayList<>();
lst.add("1");
lst.add("2");
lst.add("3");
Stream<String> stream = lst.stream();
//生成的stream只能执行一次count或者max末端方法
//System.out.println(stream.count());
//获取最大的
System.out.println(stream.max((o1, o2) -> Integer.parseInt(o1)-Integer.parseInt(o2)).get());
过滤:
//筛选出字符为3的数据
List<String> l=lst.stream().filter(str -> str.equals("3")).collect(Collectors.toList());
l.forEach(s->{System.out.println(s);});
校验:
List<String> lst=new ArrayList<>();
lst.add("1");
lst.add("1");
lst.add("2");
lst.add("3");
boolean b = lst.stream().anyMatch(str -> str.equals("3"));
System.out.println(b);
User user01=new User();
user01.setId(1);
user01.setUserName("1");
List<User> lstUser=new ArrayList<>();
lstUser.add(user01);
User user02=new User();
user02.setId(2);
user02.setUserName("2");
lstUser.add(user02);
List<Integer> lstIds = lstUser.stream().map(user -> user.getId())
.collect(Collectors.toList());
lstIds.forEach(str->System.out.println(str));
System.out.println(lstUser.stream().mapToInt(user -> user.getId()).max().getAsInt();
System.out.println(lstUser.stream().count());
System.out.println(lstIds.stream().sorted(Comparator.comparing(User::getId))
.collect(Collectors.toList()));
}
public static class User implements Comparable<User>{
private Integer id;
private String userName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public int compareTo(User user) {
return this.id.compareTo(user.getId());
}
}
flatMap
//参考:https://www.cnblogs.com/HowieYuan/p/9394552.html
//拆分得到字符串
/*List<String> list = new ArrayList<>();
list.add("aaa bbb ccc");
list.add("ddd eee fff");
list.add("ggg hhh iii");
list = list.stream().map(s -> s.split(" ")).flatMap(Arrays::stream).collect(Collectors.toList());
System.out.println(JSONObject.toJSONString(list));*/
//根据指定指端求最大的元素
List<User> lst=new ArrayList<>();
User user01=new User();
user01.setId(1);
user01.setUserName("name1");
user01.setNum(1);
lst.add(user01);
User user02=new User();
user02.setId(2);
user02.setNum(3);
user02.setUserName("name2");
lst.add(user02);
Optional<User> collect = lst.stream().collect(Collectors.maxBy(Comparator.comparing(User::getNum)));
System.out.println(JSONObject.toJSONString(collect.get()));
合并指定字符串
String collect = lst.stream().map(user -> user.getUserName()).collect(Collectors.joining(","));
System.out.println(collect);
排序获取最大id
List<Integer> idList=new ArrayList<>();
idList.add(2);
idList.add(1);
idList.add(3);
Integer maxId = idList.stream().max((o1, o2) -> o1 - o2).orElse(0);
System.out.println(maxId);