使用Java流检查ArrayList内容
考虑以下ArrayList:使用Java流检查ArrayList内容,java,arraylist,java-8,java-stream,Java,Arraylist,Java 8,Java Stream,考虑以下ArrayList: [0] => Person [1] => User [2] => Dummy 使用Java streams的用户如何检查此arraylist是否包含除Person或User之外的任何其他对象 因此,如果只包含Person和User,我可以使用if语句返回null,或者如果arraylist本身包含除Person或User以外的任何其他对象,则返回arraylist本身,如下所示: if( /*arrayList contains only Per
[0] => Person
[1] => User
[2] => Dummy
使用Java streams的用户如何检查此arraylist是否包含除Person
或User
之外的任何其他对象
因此,如果只包含Person和User
,我可以使用if语句返回null,或者如果arraylist本身包含除Person
或User
以外的任何其他对象,则返回arraylist本身,如下所示:
if( /*arrayList contains only Person and User*/ ) {
return null;
}
else {
//arrayList contains other objects besides Person and User
return arrayList;
}
假设
Person
和User
是类型,而不是特定的对象,您可以这样做
return list.stream()
.filter(o -> !(o instanceof Person) && !(o instanceof User))
.findAny()
.isPresent() ? list : null;
保罗回答的备选方案(问题中有if-else) 使用过滤器
List<Object> objLst = new ArrayList<Object>(Arrays.asList(new Object[] {new User(), new Person(), new Dummy() }));
return (objLst.stream()
.filter(e -> !(e instanceof User || e instanceof Person))
.limit(1)
.count() > 0) ? null : objLst;
List objLst=newarraylist(Arrays.asList(new Object[]{new User(),new Person(),new Dummy()}));
返回(objLst.stream()
.filter(e->!(用户的e实例| |个人的e实例))
.限额(1)
.count()>0)?null:objLst;
我更喜欢一种解决方案,它不使用ìnstanceof
硬编码类列表,如
List<Class<?>> clist = Arrays.asList(Person.class, User.class);
List<?> list = Arrays.asList(new Person(),new User(),new Dummy());
List<?> result = list.stream()
.map(Object::getClass)
.anyMatch(x ->
clist.stream().
noneMatch(c->c.isAssignableFrom(x)))
? list : null;
List List=Arrays.asList(new Person(),new User(),new Dummy());
列表结果=List.stream()
.map(对象::getClass)
.anyMatch(x->
clist.stream()。
非匹配(c->c.isAssignableFrom(x)))
? 列表:空;
为什么不使用instanceof
?这是数组列表
(还是数组列表
)?为什么使用原始类型?是的,它是一个未指定对象类型的arraylist SOP没有指定他使用的是Java8,因此,您还应该提供一个Java8之前的解决方案。@hagrawal他指定要使用streams。我更喜欢这个答案,因为它不会创建一个无用的可选的对象。@PaulBoddington我还希望allMatch
本身比过滤器
更有效。它将在第一次不匹配时提前返回,这可能是第一个元素。但是返回List
的Optional
而不是null或List
filter()。findAny()
也会提前返回。我同意返回List
或null
有点奇怪。通常建议返回空列表,而不是null
。我想说,与空列表相比,可选
并不比空
好多少。好吧,不建议使用像可选
这样的东西。通常,您希望返回Collections.emptyList()
,或者只返回一个新列表,从中删除所有非法项。返回null
或缺少列表是一个非常不寻常的要求,因为这意味着调用者必须执行null
检查,因此有条件地不使用列表引用,这与只返回allMatch
过滤器(…)的布尔值相比并没有简化用法.count()>0
可能会在计数项已大于零时浪费资源.filter(…).findAny().isPresent()
或更简单的。anyMatch(…)
是更好的选择,因为它们在遇到一个匹配项后立即返回。如果要保留基于计数的解决方案,可以使用.filter(…).limit(1).count()>0
对其进行改进,这样,它也会在遇到的第一个项目上停止。
List<Class<?>> clist = Arrays.asList(Person.class, User.class);
List<?> list = Arrays.asList(new Person(),new User(),new Dummy());
List<?> result = list.stream()
.map(Object::getClass)
.anyMatch(x ->
clist.stream().
noneMatch(c->c.isAssignableFrom(x)))
? list : null;