【发布时间】:2018-02-21 05:42:00
【问题描述】:
我被困在一个场景中,我想根据条件过滤字符串 ArrayList 中 20% 的元素。我搜索了 Stream.filter 并且有一些东西阻止我使用它。 我有一个数组列表包含字符串“一、二、三、四”和一个匹配变量 String match = “e”;假设我已经将列表作为 myList,我想做类似的事情,
public List<String> filterArrayList(List<String> myList, String match){
List<String> filtered_result=myList.stream().filter(elem -> {
if(elem.indexOf(match)!=-1){
return true;
}
return false;
}).collect(Collectors.toList());
return filtered_result;
}
filterArrayList(somelist,"e");
但这似乎不起作用,因为我无法访问过滤器内的匹配变量。它只是将列表返回为“e”,这是变量匹配的值。 过滤结果 = ["e"]
我也试过这样做,
List<String> filtered_result=myList.stream().filter(elem -> elem.contains(match)).collect(Collectors.toList());
这也返回相同的结果。有什么办法可以在这里解决吗?
PS:我不想仅仅为此目的创建一个 POJO 类,我也不能创建一个 final 变量,因为列表是这个方法的一个参数,这是我跨类的许多方法。
编辑:映射到方法的匹配变量可能因方法而异,并且不能保持不变。
【问题讨论】:
-
我不明白你的编辑,但最终参数...
public List<String> filterArrayList(final List<String> myList, final String match),不影响对象的外部值。 -
只需将
String match参数标记为final。 -
您的问题描述毫无意义。首先,您说“我无法访问过滤器内的匹配变量”,然后您说“它只是将列表返回为“e”,这是变量匹配的值”。这两个陈述之间的联系在哪里?除此之外,您将结果存储在一个名为
filtered_result的变量中,但指的是一个名为filtered_list的变量,它不会出现在您显示的代码中的其他任何地方。也许,这就是整个问题,谁知道呢。 -
@cricket_007 原始版本甚至没有围绕代码的方法/函数声明,仍然不一致地引用
filtered_result和filtered_list,更重要的是,包含这些关于根本无法进行操作,并且会得到意想不到的“结果”。 -
@MikeRoss 不要因为你无法提出一个可以理解的问题而责备他人。您接受了一个答案,其中包含与您在问题中发布的完全相同的代码,仅包含细微差别(除了没有错字),那么您的问题是什么?您的自相矛盾的问题描述,“无法访问过滤器内的匹配变量”或“它只是将列表返回为“e””,都不适用于您的代码。错字只是一个额外的矛盾。正如前面的 cmets 中明确指出的那样,not 以错字为中心。
标签: java lambda collections filter java-stream