比如说,我有一个Config类如下所示(我已经包括了下面的类)
(parentType,subType)对可以有其中一个{( 0,0),(X,0),(X,Y)},其中X> 0,Y>0。无论是父型还是子类型,值0都意味着它是一个常见的配置。非零值是一个特定的配置。通用配置适用于所有类型,特别是在没有特定配置的情况下。
如果我有一个包含以下值的Config对象的列表(列表),则以这种格式给出的值(类别、父类型、子类型、值):
("A", 0, 0, 5), ("A", 2, 0, 6), ("A", 2, 1, 9)
("B", 0, 0, 5), ("B", 2, 0, 6),
("C", 0, 0, 5), ("C", 4, 0, 13)
("D", 4, 1, 11), ("D", 4, 0, 9)
如果我在寻找父类型= 2和子类型= 1的信任,我希望下面的列表作为结果列表。("A", 2, 1, 9), ("B", 2, 0, 6), ("C", 0, 0, 5)
我们没有得到"D“对象,因为在"D”下,我们没有特定的父类型2,并且它没有公共父类型0。
类似地,如果我在寻找父类型= 4和子类型= 1的信任,我希望下面的列表作为结果列表。("A", 0, 0, 5), ("B", 0, 0, 5), ("C", 4, 0, 13), ("D", 4, 1, 11)
对于父类型4和子类型1(只是在下面编码了一个想法) list.stream().filter(oneConf -> (4=(oneConfig.getParentType()) && oneConfig.getParentType))
以上只会给出4和1的配置。我还可以有两个list.stream().filter(4和0的条件).List.stream().filter(0和0的条件)
给定父类型4和子类型1,我们可以获得以下结果列表,其中包含Java 8特性,而无需编写许多代码循环。("A",0,0,5),("B",0,0,5),("C",4,0,13),("D",4,1,11)
public class Config {
String category;
Integer parentType;
Integer subType;
Integer value;
public Config() {}
public Config(String pCategory, Integer pParentType, Integer pSubType, Integer pValue) {
category = pCategory;
parentType = pParentType;
subType = pSubType;
value = pValue;
}
}
发布于 2020-12-30 19:57:11
看起来,您希望匹配值匹配输入或值为0的每种类型(父/子)。我还猜测,您只想从每个类别中选择一个Config。
这可能会做你想做的事:
private static List<Config> filterConfig(List<Config> list, int parentType, int subType) {
return new ArrayList<>(list.stream()
.filter(c -> c.parentType == 0 || c.parentType == parentType)
.filter(c -> c.subType == 0 || c.subType == subType)
.collect(Collectors.toMap(
c -> c.category,
Function.identity(),
(p, q) -> p.parentType != 0 ? (p.subType != 0 ? p : q) : q
)).values());
}
测试:
System.out.println("2/1");
filterConfig(list, 2, 1).forEach(System.out::println);
System.out.println("4/1");
filterConfig(list, 4, 1).forEach(System.out::println);
输出:
2/1
Config{category='A', parentType=2, subType=1, value=9}
Config{category='B', parentType=2, subType=0, value=6}
Config{category='C', parentType=0, subType=0, value=5}
4/1
Config{category='A', parentType=0, subType=0, value=5}
Config{category='B', parentType=0, subType=0, value=5}
Config{category='C', parentType=4, subType=0, value=13}
Config{category='D', parentType=4, subType=1, value=11}
解释
第一个过滤器查找任何与parentType匹配的Config或parentType为0的位置(并删除任何非命中)。
第二个过滤器查找任何与subType匹配的Config或subType为0的位置。
Collector.toMap()将对象放在以类别为键的映射中。这可以确保我们在每个类别中最多找到一个Config。该值是Config对象本身。
toMap()的第三个参数是一个选择器,它在发生键冲突时从两个对象中选择一个。我放置的lambda应该首先选择具有非0 parentType的哪一个,然后选择非0 subType。如果没有发现,选第二个。
免责声明:我只测试了您的输入,以便lambda可能需要调整。
https://stackoverflow.com/questions/65511703
复制相似问题