Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java流检查ArrayList内容_Java_Arraylist_Java 8_Java Stream - Fatal编程技术网

使用Java流检查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

考虑以下ArrayList:

[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;