Java 8 从另一个列表创建谓词列表
Java 8 Creating list of predicates from another list
我正在写下面的代码,但看起来很尴尬。能不能写的更好?最后,代码必须创建一个谓词,该谓词由具有 OR 条件的谓词列表组成。
第一个谓词,它应该附加到谓词列表
Predicate<SomeDto> p1 = t -> StringUtils.isBlank(t.getColor());
来自 someListOfColors 的谓词列表
List<Predicate<SomeDto>> collect = Arrays.stream(somelistOfColors)
.map(ta -> {
Predicate<SomeDto> p2 = t -> t.getColor().equals(ta.getCode());
return p2;
}).collect(Collectors.toList());
所有谓词都应该用OR条件连接
or(p1, collect.toArray(new Predicate[collect.size()]));
OR 条件的方法
private Predicate<SomeDto> or(Predicate<SomeDto>... predicates) {
return s -> Arrays.stream(predicates).anyMatch(t -> t.test(s));
}
您可以通过组合谓词来减少您的流:
Predicate<SomeDto> collect = somelistOfColors.stream()
.map(ta -> t -> t.getColor().equals(ta.getCode()))
.reduce(a -> false, Predicate::or);
如果流为空,您将获得一个默认情况下无法通过测试的谓词。将第一个参数更改为 reduce
以根据需要进行更改。
就我个人而言,我更喜欢创建一个谓词实例来根据颜色列表检查 SomeDto
实例。如果我正确理解你的代码,这应该是正确的:
Predicate<SomeDto> collect = dto -> somelistOfColors.stream()
.anyMatch(ta -> dto.getColor().equals(ta.getCode()));
您确定需要谓词吗?看起来代码只是检查颜色列表是否包含 SomeDto
s 代码。因此可以用搜索代替
SomeDto dto = //...
Arrays.stream(somelistOfColors)
.map(color -> color.getCode())
.anyMatch(t -> t.equals(dto.getColor()));
我正在写下面的代码,但看起来很尴尬。能不能写的更好?最后,代码必须创建一个谓词,该谓词由具有 OR 条件的谓词列表组成。
第一个谓词,它应该附加到谓词列表
Predicate<SomeDto> p1 = t -> StringUtils.isBlank(t.getColor());
来自 someListOfColors 的谓词列表
List<Predicate<SomeDto>> collect = Arrays.stream(somelistOfColors)
.map(ta -> {
Predicate<SomeDto> p2 = t -> t.getColor().equals(ta.getCode());
return p2;
}).collect(Collectors.toList());
所有谓词都应该用OR条件连接
or(p1, collect.toArray(new Predicate[collect.size()]));
OR 条件的方法
private Predicate<SomeDto> or(Predicate<SomeDto>... predicates) {
return s -> Arrays.stream(predicates).anyMatch(t -> t.test(s));
}
您可以通过组合谓词来减少您的流:
Predicate<SomeDto> collect = somelistOfColors.stream()
.map(ta -> t -> t.getColor().equals(ta.getCode()))
.reduce(a -> false, Predicate::or);
如果流为空,您将获得一个默认情况下无法通过测试的谓词。将第一个参数更改为 reduce
以根据需要进行更改。
就我个人而言,我更喜欢创建一个谓词实例来根据颜色列表检查 SomeDto
实例。如果我正确理解你的代码,这应该是正确的:
Predicate<SomeDto> collect = dto -> somelistOfColors.stream()
.anyMatch(ta -> dto.getColor().equals(ta.getCode()));
您确定需要谓词吗?看起来代码只是检查颜色列表是否包含 SomeDto
s 代码。因此可以用搜索代替
SomeDto dto = //...
Arrays.stream(somelistOfColors)
.map(color -> color.getCode())
.anyMatch(t -> t.equals(dto.getColor()));