Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям / 5 сообщений из 5, страница 1 из 1
22.08.2017, 15:47
    #39508822
DevIgo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям
Есть
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
List<Carnet> listCarnet;

public class Carnet {

    private String codeTitre;
    private String nomTitre;
    private String codeIsin;

}



Я понимаю как найти нужный объект по параметрам - пройдя по коллекции так или иначе используя if, но писать методы с параметрами на каждое поле и их комбинациями кажется неправильным.
Хочу понять как именно лучше организовать поиск по одному или нескольким полям коллекции.
...
Рейтинг: 0 / 0
22.08.2017, 16:00
    #39508832
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям
Ну, Stream, лямбды и предикат.
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

Так-то требований не достаточно, чтобы правильный код привести.


Код: java
1.
2.
3.
List<Carnet> matches = listCarnet.stream()
                                   .filter(c -> "text".equals(c.codeTitre)))
                                   .collect(Collectors.toList());



В зависимости от того сколько и каких предикатов нужно, лямбда будет варьироваться. Я предпочитаю ссылки на метод лямбдам.
...
Рейтинг: 0 / 0
22.08.2017, 16:06
    #39508835
DevIgo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям
Blazkowicz,

Это скорее детали реализации и пока сложные для меня.
Меня интересует можно ли обойтись без кучи методов типа:
Код: java
1.
2.
3.
4.
findByCodeTitre(CodeTitre)
findByNomTitre(NomTitre)
findByCodeTitreAndNomTitre(CodeTitre,NomTitre)
...


и так далее
...
Рейтинг: 0 / 0
22.08.2017, 16:42
    #39508863
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям
Код черновой для демонстрации. В зависимости от требований, я бы его ещё попричесывал.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public class Find {
    static class Carnet {

        private String codeTitre;
        private String nomTitre;
        private String codeIsin;

        public Carnet(String codeTitre, String nomTitre, String codeIsin) {
            this.codeTitre = codeTitre;
            this.nomTitre = nomTitre;
            this.codeIsin = codeIsin;
        }

        public String getCodeTitre() {
            return codeTitre;
        }

        public String getNomTitre() {
            return nomTitre;
        }

        public String getCodeIsin() {
            return codeIsin;
        }

        @Override
        public String toString() {
            return "Carnet{" +
                    "codeTitre='" + codeTitre + '\'' +
                    ", nomTitre='" + nomTitre + '\'' +
                    ", codeIsin='" + codeIsin + '\'' +
                    '}';
        }
    }


    static List<Carnet> carnets = new ArrayList<>();

    public static void main(String[] args) {
        carnets.add(new Carnet("A", "B", "C"));
        carnets.add(new Carnet("Z", "B", "C"));
        Carnet sample = new Carnet("A", "D", "C");
        List<Carnet> result = findBy(sample, Carnet::getCodeIsin, Carnet::getCodeTitre);
        System.out.println(result);

    }

    private static List<Carnet> findBy(Carnet sample, Function<Carnet, ?>... getters) {
        return carnets.stream().filter(carnet -> {
            for (Function<Carnet, ?> f : getters) {
                boolean match = nullSafeEquals(f.apply(carnet), f.apply(sample));
                if(!match) return false;
            }
            return true;
        }).collect(Collectors.toList());
    }

    private static boolean nullSafeEquals(Object o, Object o1) {
        return o == o1 || (o!= null && o.equals(o1));
    }
}
...
Рейтинг: 0 / 0
22.08.2017, 16:56
    #39508873
DevIgo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям
Blazkowicz,

Спасибо за труды и расжеванный пример, кажется мысль я понял.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]