2016-03-24 10 views
5

特定の状況(OLDでない場合)のリストをリストに追加する次のコードが見つかりました。このリストは後で共通のコントロールリストにまとめられます。Java 8ストリームのリストのリファクタリングの作成

List<ListDataContent> list = new ArrayList<>(); 

    for (KonditionValue kondition : konditions) { 
     if (kondition.getStatusKz().equals(StatusKz.OLD)) 
      continue; 
     for (TermKondValue tilg : kondition.getTermimKonditions()) { 
      if (tilg.getStatusKz().equals(StatusKz.OLD)) 
       continue; 

      TerminKondListContent listContent = new TerminKondListContent(tilg, kondition.getChangeDatum(), funds); 
      list.add(listContent); 
     } 
    } 

    SimpleListControl listCtrl = new SimpleListControl(); 
    listCtrl.setDataModel(new ListDataModel(list)); 

私はjava8ストリームを使用して、次のリファクタリングを試してみました:

List<ListDataContent> list = konditionen.stream().map(kondition -> map(tilg, kondition.getChangeDate(), funds)).sorted().collect(Collectors.toList()); 
SimpleListControl listCtrl = new SimpleListControl(); 
listCtrl.setDataModel(new ListDataModel(list)); 

問題は、マップ・メソッドです...

private TerminKondListContent map(TermKondValue tilg, Date changeDate, BigDecimal funds) { 
    if (kondition.getStatusKz().equals(StatusKz.OLD)) 
     return null; 
    for (TermKondValue zins : kondition.getTerminkonditions()) { 
     if (zins.getStatusKz().equals(StatusKz.OLD)) 
      return null; 

     return new TerminKondListContent(tilg, changeDate, funds); 
    } 
    return null; 
} 

を私は続ける場合に何ができますか? nullを返しますか?ストリームからnull値をフィルタリングすることができます

list.stream().filter(Objects::nonNull) 

ここでオプションを使用するオプションはありますか?

答えて

2

それはそれはかなりありませんが、これはStream<KonditionValue>を作成し、ステータスのみがStatusKz.OLDではないものを保持し、次の

List<ListDataContent> list = 
    konditions.stream() 
       .filter(kondition -> !kondition.getStatusKz().equals(StatusKz.OLD)) 
       .flatMap(kondition -> 
       kondition.getTerminTilgkonditions() 
          .stream() 
          .filter(tilg -> !tilg.getStatusKz().equals(StatusKz.OLD)) 
          .map(tilg -> new AbstractMap.SimpleEntry<>(kondition, tilg)) 
      ) 
       .map(e -> new TerminKondTilgListContent(e.getValue(), e.getKey().getChangeDatum(), funds)) 
       .collect(Collectors.toList()); 

を持つことができます。次に、それぞれTermKondTilgValueにフラット・マップします。TermKondTilgValueのステータスがStatusKz.OLDでないもののみが保持されます。

TermKondTilgValueKonditionValueの両方を参照する必要があるので、私たちは後で必要となるので、AbstractMap.SimpleEntryを2つの値の所有者として使用します。

最後に、このストリームは対応するTerminKondTilgListContentにマップされ、リストに収集されます。

+1

これは動作するはずです。読めるのが一種難しいと思いませんか?私のソリューションは少し読みやすくなっています。この場合、 "return null"をどうすればいいのかまだ分かりませんが。 – Chris311

+2

@ Chris311あなたの解決策は、あなたの古いコードを実際に組み合わせたものです。私は読むのが難しいと思うので、あなたのforループを保つことは悪い考えではありません。 – Tunaki

+0

私はここでjava8ストリームリファクタリングを使用しません:-) – Chris311

関連する問題