Java6番石榴谓词到Java8谓词&;兰姆达

Java6番石榴谓词到Java8谓词&;兰姆达,java,predicate,Java,Predicate,我一直在用Java6开发并使用guava谓词。但是我想切换到Java8并使用Javautil谓词。我可以简单地将下面的方法转换为使用谓词,但是有没有一种聪明的方法可以使用Lambda表达式并减少代码行数?最好删除我正在创建的临时列表?我在谷歌上搜索一些例子,但它们都很简单。谢谢你的帮助 private Predicate<Objt1> getLocalAttributesPredicate() { return new Predicate<Objt1>()

我一直在用Java6开发并使用guava谓词。但是我想切换到Java8并使用Javautil谓词。我可以简单地将下面的方法转换为使用谓词,但是有没有一种聪明的方法可以使用Lambda表达式并减少代码行数?最好删除我正在创建的临时列表?我在谷歌上搜索一些例子,但它们都很简单。谢谢你的帮助

    private Predicate<Objt1> getLocalAttributesPredicate() {
    return new Predicate<Objt1>() {

        @Override
        public boolean apply(Objt1 input) {

            AttributeType attr = cache.get(input.getAttributeID());
            List<String> attrGroupids = Lists.newArrayList();
            for (AttributeGroupLinkType group : attr.getAttributeGroupLink()) {
                attrGroupids.add(group.getAttributeGroupID());
            }
            return attrGroupids.contains(localAttrGroupId) && !attrGroupids.contains(exclustionAttrGroupId);
        }
    };
}
private谓词getLocalAttributesPredicate(){
返回新谓词(){
@凌驾
公共布尔应用(Objt1输入){
AttributeType attr=cache.get(input.getAttributeID());
List AttrGroupId=Lists.newArrayList();
对于(AttributeGroupLinkType组:attr.getAttributeGroupLink()){
add(group.getAttributeGroupID());
}
返回attrGroupId.contains(localAttrGroupId)&&!attrGroupId.contains(exclustionAttrGroupId);
}
};
}

从Java-8开始,您可以这样做:

private Predicate<Objt1> getLocalAttributesPredicate() {
   return input ->  { 
         Set<String> accumulator = ...
         AttributeType attr = cache.get(input.getAttributeID());
         for(AttributeGroupLinkType group : attr.getAttributeGroupLink())
              accumulator.add(group.getAttributeGroupID());
         return accumulator.contains(localAttrGroupId) &&
                !accumulator.contains(exclustionAttrGroupId);
   };
}
private谓词getLocalAttributesPredicate(){
返回输入->{
设置累加器=。。。
AttributeType attr=cache.get(input.getAttributeID());
对于(AttributeGroupLinkType组:attr.getAttributeGroupLink())
add(group.getAttributeGroupID());
返回累加器。包含(localAttrGroupId)&&
!acculator.contains(exclustionAttrGroupId);
};
}

注意,我还为累加器使用了
Set
,因为
Contains
方法对于
Set
实现要比对于
List
实现快得多。

从Java-8开始就是这样做的:

private Predicate<Objt1> getLocalAttributesPredicate() {
   return input ->  { 
         Set<String> accumulator = ...
         AttributeType attr = cache.get(input.getAttributeID());
         for(AttributeGroupLinkType group : attr.getAttributeGroupLink())
              accumulator.add(group.getAttributeGroupID());
         return accumulator.contains(localAttrGroupId) &&
                !accumulator.contains(exclustionAttrGroupId);
   };
}
private谓词getLocalAttributesPredicate(){
返回输入->{
设置累加器=。。。
AttributeType attr=cache.get(input.getAttributeID());
对于(AttributeGroupLinkType组:attr.getAttributeGroupLink())
add(group.getAttributeGroupID());
返回累加器。包含(localAttrGroupId)&&
!acculator.contains(exclustionAttrGroupId);
};
}

注意,我还为累加器使用了
Set
,因为
Contains
方法对于
Set
实现比对于
List
实现要快得多

private Predicate<Objt1> getLocalAttributesPredicate() {
    return input -> cache.get(input.getAttributeID())
            .stream()
            .map(group -> group.getAttributeGroupID())
            .filter(id -> id.equals(localAttrGroupId))
            .filter(id -> !id.equals(exclustionAttrGroupId))
            .limit(1)
            .count() > 0;
}
private谓词getLocalAttributesPredicate(){
返回input->cache.get(input.getAttributeID())
.stream()
.map(组->组.getAttributeGroupID())
.filter(id->id.equals(localAttrGroupId))
.filter(id->!id.equals(exclustionAttrGroupId))
.限额(1)
.count()>0;
}
因此谓词作为lambda函数返回,它使用流API遍历列表并转换其内容


编辑:应用@Aominè建议的优化,谢谢。

如下所示:

private Predicate<Objt1> getLocalAttributesPredicate() {
    return input -> cache.get(input.getAttributeID())
            .stream()
            .map(group -> group.getAttributeGroupID())
            .filter(id -> id.equals(localAttrGroupId))
            .filter(id -> !id.equals(exclustionAttrGroupId))
            .limit(1)
            .count() > 0;
}
private谓词getLocalAttributesPredicate(){
返回input->cache.get(input.getAttributeID())
.stream()
.map(组->组.getAttributeGroupID())
.filter(id->id.equals(localAttrGroupId))
.filter(id->!id.equals(exclustionAttrGroupId))
.限额(1)
.count()>0;
}
因此谓词作为lambda函数返回,它使用流API遍历列表并转换其内容


编辑:应用@Aominè建议的优化,谢谢。

您可以使用
…limit(1).count()>0非常优雅,谢谢。筛选器中的id是字符串,因此我将==更改为equals方法。筛选器(id->id.equals(localAttrGroupId)).filter(id->!id.equals(ExclustionatRgroupID)。但是第二个筛选器不起作用,我从exclustion组获得结果。我做错了什么?您使用的是
!id.equals(ExclustionatRgroupID)
?我已经更新了我的答案。我不得不猜测你正在使用的类,尽管
=
vs
equals
是一个愚蠢的错误。你可以使用
…limit(1).count()>0;
非常优雅,谢谢。过滤器中的id是字符串,所以我将==改为equals方法。过滤器(id->id.equals)(localAttrGroupId)).filter(id->!id.equals(ExclustionatRgroupId)。但是第二个筛选器不工作,我从exclustion组获取结果。我做错了什么?您是否使用
!id.equals(ExclustionatRgroupId)
?我已经更新了我的答案。我不得不猜测你正在使用的类,尽管
=
vs
equals
是一个愚蠢的错误。