2016-10-07 1 views
-1

私は単純なListを注文しています。エントリの存在に基づいてサブリストを生成するラムダ式

A = ["a","b","c","d","e"]; 

基準に基づいてリストのサブセットを生成する必要があります。要素Eが配列内に存在する場合は、要素Eの後のリスト内のすべての要素を返します。そうでない場合はnullを返します。これは同等のラムダ式で行うことができます

int index = A.indexOf("e"); 
List<String> subList = A.subList(index, A.size()); 

通常、私のようなこの何かをしたいですか?

+2

注文されるリストと何が関係していますか?それでは、コードが行く限り、 'index> = 0'というチェックを含める必要はありませんか?また、サブリストの変数名を指定する必要があります。最後に、 'subList'の第2引数は排他的です。したがって、最後の要素を切り捨てるのを避けるために' A.size() - 1'の代わりに 'A.size()'を渡すべきです。 –

+0

質問にはそのメリットがあると思います。それは、私が過去にやったことのないステートフルな述語で遊ぶ機会を私に与えました。 – GuiSim

+0

事は、あなたは普通にやっていますが、それでも最高の解決策です。リストがソートされている場合は、代わりに 'int index = Collections.binarySearch(A、" e ");を使うことができます。それから、 'List subList = index <0? null:A.subList(インデックス、A.size()); '。ストリームはバイナリ検索も 'subList'でもなく、新しい' List'にまとめることは 'subList'を得ることと同じではありません。 – Holger

答えて

-2

あなたが本当にJavaの8つのストリームとLambadsを使用したい場合は、ステートフル述語

public class IsAfterString implements Predicate<String> { 

    private final String stringToWatchFor; 
    private boolean foundString = false; 

    public IsAfterString(String stringToWatchFor) { 
     this.stringToWatchFor = stringToWatchFor; 
    } 

    @Override 
    public boolean test(String s) { 

     if (foundString) { 
     return true; 
     } 

     foundString = stringToWatchFor.equals(s); 
     return false; 
    } 
} 

を使用し、そのようにそれを使用することができます。これは、次のステートメントを印刷します

List<String> a = Arrays.asList("a", "b", "c", "d", "e"); 
IsAfterString predicate = new IsAfterString("c"); 
List<String> list = a.stream().filter(predicate).collect(Collectors.toList()); 
list = predicate.hasFoundString() ? list : null; 

System.out.println(list); 

  • 素子Eが "C" => [D、E]
  • 要素Eは、あなたがparallelStreamを使用する場合は、この述語は動作しないこと=> []
  • 要素Eが "G" "E" => nullを

注意です。

+2

ステートフルな述語は悪い考えであり、Streamの仕様によって禁止されています。実際には良く分からない人に悪い習慣を教えるのは良い考えではありません。 –

+0

@BrianGoetz実際には、https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#filter-java.util.function.Predicate-仕様にリンクしてください。 Statelessnessについてhttps://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#Statelessness – GuiSim

0

リストの要素は、あなたがこのようにそれを行うことができ、Comparableある場合:

List<String> subList = list.stream() 
    .filter(elem -> elem.compareTo("e") > 0) 
    .collect(Collectors.toList()); 

これは、空のリストを返します。少しフィルタ条件変更

List<String> subList = list.stream() 
    .filter(elem -> elem.compareTo("e") >= 0) 
    .collect(Collectors.toList()); 

"e"を含むリストを返します。

これが機能するには、リストを注文する必要はありません。加えて、あなたも次のようにリストだったつまりあれば、リストに存在する要素を必要としません:

List<String> list = Arrays.asList("a", "b", "d", "e"); 

そして、あなたは "c"後の要素を返すためにフィルタ条件を変更:

List<String> subList = list.stream() 
    .filter(elem -> elem.compareTo("c") > 0) 
    .collect(Collectors.toList()); 

結果は["d", "e"]になります。

関連する問題