формирование определенного списка с потоками Java 8 - PullRequest
0 голосов
/ 22 ноября 2018

Я сейчас работаю в 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
}]

Я написал очень простой код без использования потоков:

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();
            }
        }
    }

Класс 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
}

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Для 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());

В качестве альтернативы, аналогично предложению Хольгера, вы можете использовать rangeClosed APIот IntStream as:

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());
0 голосов
/ 22 ноября 2018

Используя JDK 9, вы можете сделать:

IntStream.iterate(0, i -> i < source.size(), i -> i + 4)
         .mapToObj(x -> new SearchCriteria(source.get(x), source.get(x + 1), source.get(x + 2)))
         .collect(toList());
...