Java 列表上的流筛选器保留一些已筛选的值

Java 列表上的流筛选器保留一些已筛选的值,java,filter,stream,java-stream,Java,Filter,Stream,Java Stream,所以我需要筛选一个项目列表 项目定义: { id, category, title } 类别可以是字符串类型的T(标题)或K(关键字)。问题是,有时我们有K类的项目,可以重复标题 public List<Item> findSuggestions(String req) { List<Item> items = service.findSuggestions(req); Predicate<Item> isTitle

所以我需要筛选一个项目列表

项目定义:

{
 id, category, title
}
类别可以是字符串类型的T(标题)或K(关键字)。问题是,有时我们有K类的项目,可以重复标题

    public List<Item> findSuggestions(String req) {
        List<Item> items = service.findSuggestions(req);
        Predicate<Item> isTitle = item -> item.getCategory().equals("T");
        Predicate<Item> differentTitle = Utils.distinctByKey(Item::getTitle);
        Predicate<Item> isKeyword = item -> item.getCategory().equals("K");
        List<Item> result = items.stream()
                .filter(isTitle)
                .filter(differentTitle).collect(Collectors.toList());
        result.addAll(items.stream().filter(isKeyword).collect(Collectors.toList()));
        return result;
    }
所以我需要过滤K类的所有项目,如果标题重复,只保留其中一个

    public List<Item> findSuggestions(String req) {
        List<Item> items = service.findSuggestions(req);
        Predicate<Item> isTitle = item -> item.getCategory().equals("T");
        Predicate<Item> differentTitle = Utils.distinctByKey(Item::getTitle);
        Predicate<Item> isKeyword = item -> item.getCategory().equals("K");
        List<Item> result = items.stream()
                .filter(isTitle)
                .filter(differentTitle).collect(Collectors.toList());
        result.addAll(items.stream().filter(isKeyword).collect(Collectors.toList()));
        return result;
    }
公共列表查找建议(字符串请求){
列表项=服务。查找建议(req);
谓词isTitle=item->item.getCategory().equals(“T”);
谓词differentittle=Utils.distinctByKey(项::getTitle);
谓词isKeyword=item->item.getCategory().equals(“K”);
列表结果=items.stream()
.过滤器(isTitle)
.filter(differentittle).collect(collector.toList());
addAll(items.stream().filter(isKeyword).collect(Collectors.toList());
返回结果;
}

我想简化这个过程,而不必将逻辑分成两个不同的过滤器。

多亏了@Amongalen,谓词的使用或和操作

public List<Item> findSuggestions(String req) {
            List<Item> items = service.findSuggestions(req);
            Predicate<Item> isTitle = item -> item.getCategory().equals("T");
            Predicate<Item> differentTitle = Utils.distinctByKey(Item::getValue);
            Predicate<Item> isKeyword = item -> item.getCategory().equals("K");
            return items.stream().filter(isTitle.and(differentTitle).
                    or(isKeyword)).collect(Collectors.toList());
        }
公共列表查找建议(字符串请求){
列表项=服务。查找建议(req);
谓词isTitle=item->item.getCategory().equals(“T”);
谓词differentittle=Utils.distinctByKey(项::getValue);
谓词isKeyword=item->item.getCategory().equals(“K”);
返回items.stream().filter(isTitle.and(differentittle)。
或(isKeyword)).collect(Collectors.toList());
}

谓词finalFilter=isTitle.and(differentittle).或(isKeyword)
?非常好的解决方案!非常感谢。