Java 如何将谓词动态添加到列表中
在Java中,是否有任何方法可以动态地将谓词添加到列表中?作为一个简单的例子,我是这样做的:Java 如何将谓词动态添加到列表中,java,list,java-8,predicate,Java,List,Java 8,Predicate,在Java中,是否有任何方法可以动态地将谓词添加到列表中?作为一个简单的例子,我是这样做的: List<Predicate<String>> filters = Arrays.asList( t -> !Utilities.isNumeric(t) ); filters.add(t -> !t.isEmpty()); 解决方案: List<Predicate<String>> filters = new ArrayList&l
List<Predicate<String>> filters = Arrays.asList(
t -> !Utilities.isNumeric(t)
);
filters.add(t -> !t.isEmpty());
解决方案:
List<Predicate<String>> filters = new ArrayList<>(Arrays.asList(
t -> !Utilities.isNumeric(t)
));
List filters=newarraylist(Arrays.asList(
t->!Utilities.isNumeric(t)
));
说明:
Arrays.asList
为数组参数返回固定长度的list1包装。由于它的大小是固定的,因此更改大小的方法会抛出UnsupportedOperationException
通过将其输入到ArrayList
构造函数,可以创建一个新列表,其大小可以更改
1-。。。。但是这个列表不是一成不变的。可以通过更新备份数组或使用
List::set(int,T)
方法对其进行修改。这里的问题是创建固定大小的列表:无法添加到使用此方法获得的列表中
您必须创建一个可变列表,例如使用new ArrayList()
:
List filters=newarraylist(Arrays.asList(
t->!Utilities.isNumeric(t)
));
filters.add(t->!t.isEmpty());
将起作用,因为过滤器
列表是可变的。返回一个固定的列表实例:
返回指定数组支持的固定大小列表
当你“手动”写下一系列事情时,它的意思是“快捷方式”。精确地说,是一份“固定大小”的清单。这意味着您可以“替换”元素,但不能添加或删除条目
因此,只需使用该调用的结果作为创建另一个列表的输入,例如:newarraylist(Arrays.asList(…)
如果您需要将两个谓词应用于某些输入,您可以将它们链接起来。唯一的缺点是涉及大量强制转换-因为lambda表达式和方法引用都是多边形表达式
Predicate<String> both = ((Predicate<String>) Utilities::isNumeric).negate()
.and(((Predicate<String>) String::isEmpty).negate());
谓词两者=((谓词)实用程序::isNumeric).否定()
.和(((谓词)字符串::isEmpty).negate());
这是因为您需要将这两个谓词应用于某些输入吗?是的。实际上我想稍后将它们组合起来。实现比这复杂得多。它用于一个在其他类中使用的类,不同的调用类将有自己的一组筛选器。我没有注意到。非常感谢,它现在正在工作。我很抱歉我还在学习Java8,顺便说一句,很好。是的,实际上最后,我想合并所有的过滤器,我使用这个compositeFilter=filters.stream().reduce(f->true,谓词::and)
List<Predicate<String>> filters = new ArrayList<>(Arrays.asList(
t -> !Utilities.isNumeric(t)
));
filters.add(t -> !t.isEmpty());
Predicate<String> both = ((Predicate<String>) Utilities::isNumeric).negate()
.and(((Predicate<String>) String::isEmpty).negate());