[var = modify(var)]是一种不好的做法吗?

时间:2016-06-15 13:04:20

标签: java

作为简化示例,给出一组数字。我需要应用一些值过滤器。

所以我现在正在做的事情:

原始给定数组: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);

我的感觉告诉我,它可以做得更好。但我不知道怎么做。有人可以给我建议,改进我的代码的建议吗?

3 个答案:

答案 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. https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

  2. https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#filter-java.util.function.Predicate-

答案 1 :(得分:0)

您可以将语句链接在一起,例如:

List<Integer> filteredList = removeZeroNumber(
                               removeOddNumber(
                                 removeNegativeNumber(originalList)));

但这很浪费,因为它使用每种方法从ListFluentIterable来回映射。您最好将链接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());