请看这段代码: (这是工作代码,但我不喜欢使用 2 行,所以寻找如何让它变得更好)
ItemDetails[] items = response.getDetailsList();
items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase("acl1")).toArray(ItemDetails[]::new);
items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase("acl2")).toArray(ItemDetails[]::new);
我不知道如何在 filter
中使用 OR (|)
条件从 List
中删除两个特定元素,因为它会给出我编译时错误(在 IDE 中),我最终像上面那样使用了两个 filters
。
我可能缺少什么?
这就是我尝试使用 OR 的方式
items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase("acl1") ||
x -> !x.getName().equalsIgnoreCase("acl2")).toArray(ItemDetails[]::new);
=> IntelliJ 会提示这个(上图)
items = Arrays.stream(items).filter(x -> !x.getName().equalsIgnoreCase("acl1"") ||
x.getName().equalsIgnoreCase("acl2")).toArray(ItemDetails[]::new);
在运行时不起作用(它不过滤)
带有注释代码的完整代码(我试过)以供引用
public static void mapTest () {
AclDetailItem[] items = new AclDetailItem[3];
AclDetailItem item1 = new AclDetailItem();
item1.setAclName("acl1");
AclDetailItem item2 = new AclDetailItem();
item2.setAclName("acl2");
AclDetailItem item3 = new AclDetailItem();
item3.setAclName("acl3");
items[0] = item1;
items[1] = item2;
items[2] = item3;
System.out.println ("Before " + items.length);
items = Arrays.stream(items).filter(x -> !x.getAclName().equalsIgnoreCase("acl1")).toArray(ItemDetails[]::new);
items = Arrays.stream(items).filter(x -> !x.getAclName().equalsIgnoreCase("acl2")).toArray(ItemDetails[]::new);
System.out.println ("After " + items.length);
}
最佳答案
您应该为每个条件创建多个谓词并使用或连接它。我添加了以下示例:
public class MeTest {
Predicate<Integer> con1 = i -> i==0;
Predicate<Integer> con2 = i -> i==1;
Predicate<Integer> con3 = i -> i==2;
@Test
public void testOr() {
List<Integer> asdas = IntStream.range(1, 10).boxed().filter(con1.or(con2).or(con3)).collect(toList());
System.out.println("asdas = " + asdas);
}
}
关于Java 8 流 - 或条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40551216/