Java6番石榴谓词到Java8谓词&;兰姆达
我一直在用Java6开发并使用guava谓词。但是我想切换到Java8并使用Javautil谓词。我可以简单地将下面的方法转换为使用谓词,但是有没有一种聪明的方法可以使用Lambda表达式并减少代码行数?最好删除我正在创建的临时列表?我在谷歌上搜索一些例子,但它们都很简单。谢谢你的帮助Java6番石榴谓词到Java8谓词&;兰姆达,java,predicate,Java,Predicate,我一直在用Java6开发并使用guava谓词。但是我想切换到Java8并使用Javautil谓词。我可以简单地将下面的方法转换为使用谓词,但是有没有一种聪明的方法可以使用Lambda表达式并减少代码行数?最好删除我正在创建的临时列表?我在谷歌上搜索一些例子,但它们都很简单。谢谢你的帮助 private Predicate<Objt1> getLocalAttributesPredicate() { return new Predicate<Objt1>()
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)
?我已经更新了我的答案。我不得不猜测你正在使用的类,尽管=
vsequals
是一个愚蠢的错误。你可以使用…limit(1).count()>0;
非常优雅,谢谢。过滤器中的id是字符串,所以我将==改为equals方法。过滤器(id->id.equals)(localAttrGroupId)).filter(id->!id.equals(ExclustionatRgroupId)。但是第二个筛选器不工作,我从exclustion组获取结果。我做错了什么?您是否使用!id.equals(ExclustionatRgroupId)
?我已经更新了我的答案。我不得不猜测你正在使用的类,尽管=
vsequals
是一个愚蠢的错误。