【编程技巧】
前言
在很多时候有需要根据对象的多个key组合唯一进行匹配的场景,那么使用stream如何优雅的实现这一功能呢,废话不多说,直接上代码
一、示例
public class TestClass {
public static void main(String[] args) {
List<TestData> list = new ArrayList<>();
list.add(new TestData("a",true,23));
list.add(new TestData("a",true,23));
list.add(new TestData("a",false,25));
list.add(new TestData("b",true,25));
list.add(new TestData("b",false,25));
Map<String, TestData> map = list.stream().collect(Collectors.toMap(d -> d.getName() + "-" + d.getSex(), Function.identity(),(d1,d2) -> d1));
List<TestDataA> list1 = new ArrayList<>();
list1.add(new TestDataA("a",true,50.50));
list1.add(new TestDataA("c",true,50.50));
for (TestDataA a : list1) {
TestData data = map.get(a.getName() + "-" + a.getSex());
if (Objects.nonNull(data)){
System.out.println(a);
}
}
}
}
@Data
class TestData{
private String name;
private Boolean sex;
private Integer age;
public TestData(){}
public TestData(String name, Boolean sex, Integer age) {
this.name = name;
this.sex = sex;
this.age = age;
}
}
@Data
class TestDataA{
private String name;
private Boolean sex;
private Double weight;
public TestDataA(){}
public TestDataA(String name, Boolean sex, Double weight) {
this.name = name;
this.sex = sex;
this.weight = weight;
}
}
示例中使用name和sex作为一个key得到一个新的map,(d1,d2) -> d1参数表示如果出现重复数据取最先拿到的数据,我们根据唯一key对两个list中的数据进行匹配,最终数据结果如下:
总结
合理的使用stream操作能够简化代码,提高效率和代码质量。