2016-06-15 7 views
1

単純な例として、数字の配列が与えられています。いくつかのバリューフィルターを適用する必要があります。[var = modify(var)]は悪い習慣ですか?

だから私は現在やっている:

オリジナル指定された配列:私が使用してどのように

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

List<Integer>originalList;

を、私は私のフィルタリング方法を構築する方法私の気持ちは、それがよりうまくいくことを私に伝えます。しかし、私はどのように知りません。誰かが助言、私のコードを改善するための推奨を与えることができますか?

+0

あなたが望むことは、 'FluentIterable.from(numberList).filter(rmNegative).filter(rmZero).filter(rmOddです).toList(); '? – Ninja

答えて

2

はラムダとStream#filter()を考えてみましょうJava 8を使用して再:

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-

+0

これは複数の場所でオートボックスが必要です。パフォーマンスを向上させるために、 'IntStream'に変換して戻してください。 – 4castle

+0

コメントありがとうございました@ 4castle、私は私の答えを更新しました。 – ck1

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

@tobias_kはい、私はストリームと考えていました。更新されました。 – 4castle

0

、あなたは側面を持つメソッドを使用することができます純粋な関数ではなく、効果:

removeNegativeNumber(theOnlyList); 
removeOddNumber(theOnlyList); 
removeZeroNumber(theOnlyList); 
// now the list only contains positive non-zero even numbers 

これらのメソッドは、現在の要素が条件を満たしていない場合にIteratorremove()メソッドを使用して実装できます。


あなたが元の値ではなく、過渡的な値を保持する必要がある場合は、純粋な関数を使用する必要がありますし、4castleによって記載されているように、それらをリンクします。さらにとして、そうするためのより多くの近代的な方法はStream APIを使用することです:

List<Integer> filteredList = originalList.stream() 
             .filter(i -> i >= 0) 
             .filter(i -> i % 2 == 0) 
             .filter(i -> i != 0) 
             .collect(Collectors.toList()); 
関連する問題