我有一个清单:
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");
}
}
}
答案 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");