使用Java 8流形成特定列表

Was*_*kni 9 java java-8 java-stream

我目前正在一个java项目中工作,我有一个字符串列表,我希望他们使用流具有特定的格式.

例如

输入:[nom, contains, b, and, prenom, contains, y, and, age, >=, 1, and, age, <=, 100] 输出:

[
{key:"nom",
operation:"contains",
value:"b"
},
{
key:"prenom",
operation:"contains",
value:"y"
},
{
key:"age",
operation:">=",
value: 1
},
{
key:"age",
operation:"<=",
value: 1000
}]
Run Code Online (Sandbox Code Playgroud)

我写了一个非常基本的代码而不使用流:

List filter = [nom, contains, b, and, prenom, contains, y, and, age, >=, 1, and, age, <=, 100]
    List<SearchCriteria> formedFilter = new ArrayList<>();
    SearchCriteria sc = new SearchCriteria();
    if(filter != null){
        for(int i = 0 ;i< filter.size();i++){
            if(i % 4 ==0){
                sc.setKey((String) filter.get(i));
            }else if(i % 4 == 1){
                sc.setOperation((String) filter.get(i));

            }else if(i % 4 ==2){
                sc.setValue(filter.get(i));
                formedFilter.add(sc);

            }else{
                sc = new SearchCriteria();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

SearchCriteria类

public class SearchCriteria {
    private String key;
    private String operation;
    private Object value;

    public SearchCriteria() {
    }

    public SearchCriteria(String key, String operation, Object value) {
        this.key = key;
        this.operation = operation;
        this.value = value;
    }

   // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

Nam*_*man 4

对于Aomine 答案的 Java 8 版本,您可以使用:

List<SearchCriteria> formedFilter = IntStream.iterate(0, i -> i + 4)
            .limit(filter.size() / 4 + 1) // + 1 to consider the last group as well
            .mapToObj(i -> new SearchCriteria(filter.get(i), filter.get(i + 1), filter.get(i + 2)))
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

或者,与 Holger 的建议类似,您可以使用rangeClosedIntStream 中的 API,如下所示:

List<SearchCriteria> formedFilter2 = IntStream.rangeClosed(0, filter.size() / 4)
        .map(i -> i * 4)
        .mapToObj(i -> new SearchCriteria(filter.get(i), filter.get(i + 1), filter.get(i + 2)))
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,由于“limit”的放置在这里无关紧要,我会立即将其链接到“iterate”,因为这在语义上更接近,并且更容易理解迭代逻辑。 (2认同)
  • @nullpointer我认为用`.limit(filter.size() / 4 + 1)`替换`.limit(filter.size() / 4 + 1)`可以正确完成工作 (2认同)
  • @WassimMakni 是的,Holger 也建议使用“range..” API 来建议一种更干净的方法 (2认同)