Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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 如何将谓词动态添加到列表中_Java_List_Java 8_Predicate - Fatal编程技术网

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

在Java中,是否有任何方法可以动态地将谓词添加到列表中?作为一个简单的例子,我是这样做的:

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());