将Java 6 Guava Predicate转换为Java 8 Predicate及Lambda的优化方案
嘿,这个转换其实非常顺畅,Java 8的Lambda表达式和Stream API刚好能帮你既完成Predicate的替换,又精简代码、干掉那些临时列表~ 我给你分几种场景来拆解方案:
1. 基础转换:把Guava Predicate换成Java 8 Predicate(保留逻辑,精简写法)
假设你原来的Guava Predicate代码是这样的(常见的过滤场景):
// Java 6 + Guava import com.google.common.base.Predicate; private Predicate<Objt1> getLocalAttributesPredicate() { List<String> tempAttrList = Arrays.asList("attrA", "attrB", "attrC"); // 临时列表 return new Predicate<Objt1>() { @Override public boolean apply(Objt1 input) { return tempAttrList.contains(input.getAttr()); } }; }
换成Java 8的java.util.function.Predicate后,直接用Lambda干掉匿名类,代码瞬间清爽:
// Java 8 基础版本 import java.util.function.Predicate; private Predicate<Objt1> getLocalAttributesPredicate() { List<String> tempAttrList = Arrays.asList("attrA", "attrB", "attrC"); return input -> tempAttrList.contains(input.getAttr()); // Lambda直接实现test方法 }
2. 进阶优化:移除临时列表+提升性能
如果这个属性列表是固定不变的,完全没必要每次调用方法都创建新的临时列表。把它改成静态常量集合(用HashSet比ArrayList的contains性能更好,尤其是元素多的时候):
// 把固定集合抽成静态常量,避免重复创建 private static final Set<String> LOCAL_ATTRS = new HashSet<>(Arrays.asList("attrA", "attrB", "attrC")); private Predicate<Objt1> getLocalAttributesPredicate() { return input -> LOCAL_ATTRS.contains(input.getAttr()); }
3. 终极精简:结合Stream API,连Predicate方法都可以省掉
如果这个过滤逻辑只在某一处使用,完全可以直接把Lambda内联到Stream的filter方法里,彻底移除临时列表和单独的Predicate方法:
// 原来你可能用Guava的Collections2.filter: // List<Objt1> filtered = Collections2.filter(allObjs, getLocalAttributesPredicate()); // 现在换成Java 8 Stream,直接内联过滤逻辑 List<Objt1> filtered = allObjs.stream() .filter(obj -> new HashSet<>(Arrays.asList("attrA", "attrB", "attrC")).contains(obj.getAttr())) .collect(Collectors.toList()); // 要是集合固定,同样可以用静态常量优化: List<Objt1> filtered = allObjs.stream() .filter(obj -> LOCAL_ATTRS.contains(obj.getAttr())) .collect(Collectors.toList());
额外小技巧:多条件组合
如果你的Predicate需要多个判断条件,用Lambda的逻辑运算符或者Predicate的默认方法(and/or)就能轻松组合:
// 用Lambda逻辑运算符 private Predicate<Objt1> getComplexPredicate() { return input -> LOCAL_ATTRS.contains(input.getAttr()) && input.isEnabled(); } // 用Predicate默认方法(适合条件需要拆分复用的场景) private Predicate<Objt1> getComplexPredicate() { Predicate<Objt1> attrFilter = input -> LOCAL_ATTRS.contains(input.getAttr()); Predicate<Objt1> enabledFilter = input -> input.isEnabled(); return attrFilter.and(enabledFilter); }
这样下来,代码不仅完全切换到Java 8的API,还比原来更简洁高效,临时列表也彻底消失啦~
内容的提问来源于stack exchange,提问作者PK0513
相关产品推荐
相关产品推荐

