作为简化示例,给出一组数字。我需要应用一些值过滤器。
所以我现在正在做的事情:
原始给定数组:List<Integer>originalList;
我如何构建我的过滤方法:
List<Integer> removeNegativeNumber(final List<Integer> numberList) {
return FluentIterable.from(numberList).filter(rule).toList();
}
我如何使用:
List<Integer> filteredList = removeNegativeNumber(originalList);
filteredList = removeOddNumber(filteredList);
filteredList = removeZeroNumber(filteredList);
我的感觉告诉我,它可以做得更好。但我不知道怎么做。有人可以给我建议,改进我的代码的建议吗?
答案 0 :(得分:2)
如果您正在使用Java 8,请考虑使用lambdas和Stream#filter()
:
List<Integer> list = Arrays.asList(0, 1, 2, 3, 4, 5);
List<Integer> filteredList = list.stream()
.filter(i -> i % 2 == 0)
.filter(i -> i != 0)
.collect(Collectors.toList());
System.out.println(filteredList);
或使用IntStream
:
IntStream stream = IntStream.of(0, 1, 2, 3, 4, 5);
IntStream filteredStream = stream.filter(i -> i % 2 == 0)
.filter(i -> i != 0);
filteredStream.forEach(System.out::println);
的Javadoc:
答案 1 :(得分:0)
您可以将语句链接在一起,例如:
List<Integer> filteredList = removeZeroNumber(
removeOddNumber(
removeNegativeNumber(originalList)));
但这很浪费,因为它使用每种方法从List
到FluentIterable
来回映射。您最好将链接FluentIterable
方法链接起来:
List<Integer> filteredList = FluentIterable.from(numberList)
.filter(i -> i > 0)
.filter(i -> i % 2 == 0)
.toList();
如果您使用的是Java 8,则应使用IntStream
来防止重复的自动装箱:
List<Integer> filteredList = originalList.stream()
.mapToInt(Integer::intValue)
.filter(i -> i > 0)
.filter(i -> i % 2 == 0)
.boxed()
.collect(Collectors.toList());
答案 2 :(得分:0)
如果您不需要保留原始值或过渡值,则可以使用带副作用的方法而不是纯函数:
removeNegativeNumber(theOnlyList);
removeOddNumber(theOnlyList);
removeZeroNumber(theOnlyList);
// now the list only contains positive non-zero even numbers
当当前元素不满足条件时,可以使用Iterator
remove()
方法实现这些方法。
如果您需要保留原始值,而不是过渡值,则应使用纯函数并按照4castle的描述链接它们。另外,更现代的方法是使用Stream
API:
List<Integer> filteredList = originalList.stream()
.filter(i -> i >= 0)
.filter(i -> i % 2 == 0)
.filter(i -> i != 0)
.collect(Collectors.toList());