首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我能为这个写一个列表流吗?

我能为这个写一个列表流吗?
EN

Stack Overflow用户
提问于 2020-12-30 18:18:18
回答 1查看 58关注 0票数 0

比如说,我有一个Config类如下所示(我已经包括了下面的类)

(parentType,subType)对可以有其中一个{( 0,0),(X,0),(X,Y)},其中X> 0,Y>0。无论是父型还是子类型,值0都意味着它是一个常见的配置。非零值是一个特定的配置。通用配置适用于所有类型,特别是在没有特定配置的情况下。

如果我有一个包含以下值的Config对象的列表(列表),则以这种格式给出的值(类别、父类型、子类型、值):

代码语言:javascript
运行
复制
("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)

代码语言:javascript
运行
复制
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;
    }
    
    
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-30 19:57:11

看起来,您希望匹配值匹配输入或值为0的每种类型(父/子)。我还猜测,您只想从每个类别中选择一个Config。

这可能会做你想做的事:

代码语言:javascript
运行
复制
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());

}

测试:

代码语言:javascript
运行
复制
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);

输出:

代码语言:javascript
运行
复制
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可能需要调整。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65511703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档