将string []与带有流的对象列表进行比较?

时间:2018-11-22 13:51:22

标签: java java-stream

我有一个清单:

String[] properties = {"prop1","prop2","prop3"};
List<CustomObject> listOfObjects; // contains objects and each object contains a property of `properties` array

class CustomObject{
   String prop1;
   String prop2;
   String prop3;

}

我想检查每个properties对象属性的每个listOfObjects值,并检查该值是否为空。我只想检查所有对象都没有空属性。

我知道有stream(),但不确定如何正确使用它。

listOfObjects.stream().anyMatch(x -> x.get(/*What do i put in here?*/) == "");

更新:如果没有stream()

,这基本上是可行的
    for(String prop: properties) {
        for(CustomObject pdo: listOfObjects) {
            if(pdo.get(prop) == "") {
                System.out.println("Some of the required fields are empty");
        }
    }
}

2 个答案:

答案 0 :(得分:1)

仅出于使用Streams和anyMatch的目的,您可以使用此操作来检查是否有任何属性为空。这只是专门回答您的问题,我的建议是花一些时间来改善此问题,因为还有很多空间。

listOfObject.stream()
                .anyMatch(obj -> Arrays.stream(obj)
                        .anyMatch(p -> !(obj.get(p)!= null && !obj.get(p).isEmpty())));

答案 1 :(得分:0)

您只能使用Predicate的列表。以下每个谓词针对""测试一个属性是否相等。

List<Predicate<CustomObject>> propertiesCheckers = 
        Arrays.asList(pdo -> "".equals(pdo.get("prop1")),
            pdo -> "".equals(pdo.get("prop2")),
            pdo -> "".equals(pdo.get("prop3")));

此流将根据谓词检查每个元素,并在找到第一个空值时返回true

boolean anyEmpty = listOfObjects.stream()
        .flatMap(ob -> propertiesCheckers.stream().map(pred -> pred.test(ob)))
        .anyMatch(b -> b); //returns true if any "".equals returned true

if(anyEmpty) System.out.println("Some of the required fields are empty");