S3に保存されているJSONファイルのソースのリストがあります。リストのいくつかのフィールドに検索フィルターを提供する必要があります。データをフィルタリングできる必要なすべてのフィールドを含むビルダークラスを作成しました。
次に、Javaストリームを使用して、ユーザーが提供するパラメーターに基づいてデータにフィルターを適用します。ユーザーは、6つのパラメーターすべてを提供するか、必要に応じて2つまたは3つのパラメーターのみを渡すことができます。たとえば、ユーザーは6つのうち2つのパラメーターのみを提供します。与えられた2つのパラメーターに基づいてデータをフィルター処理し、値がnullである4つのパラメーターを無視できます。
public class ListOfFields {
private String country;
@JsonProperty("product")
private String product;
private String transactionId;
private String sourceBy;
private String category;
private String specialTag;
private String organicTag;
private String successTag;
private String speedTag;
private String foodTag;
private String costPrice;
private String fruitType;
private String fruitVendorId;
}
以下はビルダークラスです
public class ProductClass {
@Builder.Default
private String country = 'UnitedStates';
private String sourceBy;
private Boolean specialTag;
private String category;
private Boolean priceTag;
private String fruitType;
}
ユーザーが製品を取得するために電話をかけることができる以下のメソッド
public String getProduct(ProductClass productQuery) {
List<ListOfFields> result = listOfFields // (the declaration is made before in the class as private List<ListOfFields> listOfFields;)
.stream().filter(productQuery::match)
.collect(Collectors.toList());
上記の一致関数として動的述語を思いつくにはどうすればよいですか?ユーザーから提供されたパラメーターを1、2、3、4のいずれかでフィルターできるはずです。ユーザーがフィルター条件に値を渡さなかったパラメーターは使用しません。
キーがない場合のProductClass
入力とnull
値として考慮します。Predicate
実際のクエリパラメータを受け取るメソッドを使用して、可能なのリストを定義できます。
private static List<Predicate<ListOfFields>> predicates(ProductClass product) {
return List.of(
lof -> product.priceTag != null && product.priceTag,
lof -> product.specialTag != null && product.specialTag,
lof -> product.country != null && product.country.equals(lof.country),
lof -> product.sourceBy != null && product.sourceBy.equals(lof.sourceBy),
lof -> product.category != null && product.category.equals(lof.category),
lof -> product.fruitType != null && product.fruitType.equals(lof.fruitType)
);
}
これに到達すると、リストは次のようreduce
な単一を表すためにdになりますPredicate
。
private static Predicate<ListOfFields> matchAll(List<Predicate<ListOfFields>> queries) {
return queries.stream()
.reduce(Predicate::and)
.orElse(p -> true);
}
これstream
で、タイプのオブジェクトにINGしながら、この述語を簡単に利用できますListOfFields
-
List<ListOfFields> result = listOfFields.stream()
.filter(matchAll(predicates(productQuery)))
.collect(Collectors.toList());
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加