Stream
package mms.shop.app.api.order;
import lombok.Data;
import java.util.*;
import java.util.stream.Collectors;
public class test {
@Data
public static class stutest {
String name;
char sex;
int eag;
public stutest(String name, char sex, int eag) {
this.name = name;
this.sex = sex;
this.eag = eag;
}
}
public static void main(String[] args) {
List<stutest> list = new ArrayList<>();
list.add(new stutest("name1", '男', 1));
list.add(new stutest("name2", '女', 2));
list.add(new stutest("name3", '女', 3));
list.add(new stutest("name4", '男', 1));
list.add(new stutest("name5", '女', 3));
list.add(new stutest("name6", '女', 1));
list.add(new stutest("name7", '男', 2));
list.add(new stutest("name8", '女', 1));
list.add(new stutest("name9", '女', 5));
list.add(new stutest("name10", '男', 9));
//筛选 输出结果 :name1 name2 name4 name5 name6 name7 name8 name9 name10
List<stutest> filtered = list.stream().filter(itme -> !itme.getName().equals("name3")).collect(Collectors.toList());
filtered.forEach(str -> System.out.println(str.getName()));
//年龄加2
filtered.forEach(str -> str.setEag(str.getEag() + 2));
//输出姓名 对应年龄 结果:
//name1-3
//name2-4
//name4-3
//name5-5
//name6-3
//name7-4
//name8-3
//name9-7
//name10-11
filtered.forEach(str -> System.out.println(str.getName() + "-" + str.getEag()));
//map 方法用于映射每个元素到对应的结果 也就是说得到一个新的结果 i 相当于是 list 中的一个itme
//结果:
//我叫:name1
//我叫:name2
//我叫:name3
//我叫:name4
//我叫:name5
//我叫:name6
//我叫:name7
//我叫:name8
//我叫:name9
//我叫:name10
List<String> squaresList = list.stream().map(i -> "我叫:" + i.getName()).distinct().collect(Collectors.toList());
squaresList.forEach(itme -> System.out.println(itme));
//Collectors.mapping 与上方法作用一样
// 区别 上方法可以 对 i.getName() 进行变更 例如 i.getName()+"1" 之类的拼接或者其他变更
//结果:
//name1
//name2
//name3
//name4
//name5
//name6
//name7
//name8
//name9
//name10
List<String> list1 = list.stream().collect(Collectors.mapping(stutest::getName, Collectors.toList()));
list1.forEach(itme -> System.out.println(itme));
List<Integer> eag = list.stream().collect(Collectors.mapping(stutest::getEag, Collectors.toList()));
System.out.println("列表中最大的数 : " + eag.stream().mapToInt((x) -> x).summaryStatistics().getMax());
//列表中最大的数 : 11
System.out.println("列表中最小的数 : " + eag.stream().mapToInt((x) -> x).summaryStatistics().getMin());
//列表中最小的数 : 3
System.out.println("所有数之和 : " + eag.stream().mapToInt((x) -> x).summaryStatistics().getSum());
//所有数之和 : 46
System.out.println("平均数 : " + eag.stream().mapToInt((x) -> x).summaryStatistics().getAverage());
//平均数 : 4.6
//直接连接
//结果 :
//name1name2name3name4name5name6name7name8name9name10
String join1 = list.stream().map(stutest::getName).collect(Collectors.joining());
System.out.println("join1====================" + join1);
//逗号连接
//结果 :
//name1, name2, name3, name4, name5, name6, name7, name8, name9, name10
String join2 = list.stream().map(stutest::getName).collect(Collectors.joining(", "));
System.out.println("join2====================" + join2);
//计算list 中名字不等于name3 的数量
//结果
//9
long count1 = list.stream().filter(itme -> !itme.getName().equals("name3")).collect(Collectors.toList()).size();
System.out.println("count1====================" + count1);
//同 .count() .count() 作用于流
//结果
//9
long count = list.parallelStream().filter(string -> !string.getName().equals("name3")).count();
System.out.println("count====================" + count);
//list转map
//结果
//{name6=3, name5=5, name4=3, name3=3, name10=11, name9=7, name8=3, name7=4, name2=4, name1=3}
Map<String, Integer> map = list.stream().collect(Collectors.toMap(stutest::getName, stutest::getEag));
System.out.println(map);
//key值相同时 用后面的value 替换前面的value
//结果
//{3=name8, 4=name7, 5=name5, 7=name9, 11=name10}
Map<Integer, String> map1 = list.stream().collect(Collectors.toMap(stutest::getEag, stutest::getName, (key1, key2) -> key2));
System.out.println(map1);
//按年龄分组 key 为分组 value 为分组后的值 值为 分组后属于key 这一组的 对象的 姓名
//结果
//prodMap======={3=[name1, name3, name4, name6, name8], 4=[name2, name7], 5=[name5], 7=[name9], 11=[name10]}
Map<Integer, List<String>> prodMap = list.stream().collect(Collectors.groupingBy(stutest::getEag, Collectors.mapping(stutest::getName, Collectors.toList()))); //counting() , Collectors.mapping(stutest::getName, Collectors.toList()))
System.out.println("prodMap=======" + prodMap);
}
}