2017-09-07 11 views
2

誰かが私を助けることを願っています。私はInvoiceクラスのArrayListを持っています。私が得ようとしているのは、このArrayListをフィルタリングし、そのプロパティの1つがregexと一致する最初の要素を見つけることです。regexが動作しないJavaストリームフィルタ

public class Invoice { 
    private final SimpleStringProperty docNum; 
    private final SimpleStringProperty orderNum; 

    public Invoice{ 
    this.docNum = new SimpleStringProperty(); 
    this.orderNum = new SimpleStringProperty(); 
} 

    //getters and setters 
} 

私は整数の形式を持っていないorderNumプロパティに任意の値があるかどうか見つけるために、このregex(\\D+)でフィルタリングしています: Invoiceクラスは次のようになります。 だから基本的に私はこのストリームを使用しています

Optional<Invoice> invoice = list 
          .stream() 
          .filter(line -> line.getOrderNum()) 
          .matches("(\\D+)")) 
          .findFirst(); 

しかし、それは動作しません。何か案が? 私が検索してきたと私はthisようpattern.asPredicate()を使用する方法が見つかりました:

Pattern pattern = Pattern.compile("..."); 

List<String> matching = list.stream() 
     .filter(pattern.asPredicate()) 
     .collect(Collectors.toList()); 

IntegerListStringなどで、私はPOJOでそれを行う方法を発見していません。 ご協力いただければ幸いです。 ニースの日

+0

java8ストリームは、何の 'matches'方法を持っていない、このコードが有効ですか? – ByeBye

答えて

6

あなたはほぼあります。ここで何が起こっている

Optional<Invoice> invoice = list.stream() 
    .filter(invoice -> invoice.getOrderNum().matches("\\D+")) 
    .findFirst(); 

あなたはfilterストリームに使用されるカスタムPredicateを作成することです。現在のInvoiceをブール値の結果に変換します。


あなたはすでにあなたは再利用したいと思いコンパイルPatternお持ちの場合:

Pattern p = … 
Optional<Invoice> invoice = list.stream() 
    .filter(invoice -> p.matcher(invoice.getOrderNum()).matches()) 
    .findFirst(); 
+0

ありがとう、それはかなりうまく動作します。 – pburgov

関連する問題