我试图找出如何在Java Lambda中的单个过滤器上执行多个谓词,但没有太多运气。
我有一个字符串列表
List<String> namesList = new ArrayList(){};
namesList.add("John");
namesList.add("Jane");
namesList.add("Smith");
namesList.add("Roger");
我在pseudologic中有两个if语句,我想测试但不确定如何用lambda做这个(我可以做旧学校的方法,但试着在这里学习)。
if nameslist contains John and Roger
print "John & Roger"
if nameslist contains Jane and Smith
print "Jane Smith"
使用Java lambda如何测试列表中的两种方案?
答案 0 :(得分:1)
我会这样做:
if (namesList.stream()
.filter(x -> (x.equals("John") || x.equals(("Roger"))))
.collect(Collectors.toSet())
.size() == 2) {
System.out.print("John & Roger");
}
if (namesList.stream()
.filter(x -> (x.equals("Jane") || x.equals(("Smith"))))
.collect(Collectors.toSet())
.size() == 2) {
System.out.print("Hane Smith");
}
答案 1 :(得分:1)
不要使用流:只需将英语转换为代码:
if (namesList.contains("John") && namesList.contains("Roger"))
System.out.println("John & Roger");
或者
if (namesList.containsAll(Arrays.asList("John", "Roger")))
System.out.println("John & Roger");
它更容易阅读,并且可能比基于流的方法表现得更好或更好。
lambda不是正确的做法。
答案 2 :(得分:0)
你可以将distinct和count结合起来:
if (namesList.stream()
.filter(s -> s.equals("John") || s.equals("Roger"))
.distinct()
.count() == 2) {
System.out.print("John & Roger");
}