powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям
5 сообщений из 5, страница 1 из 1
Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям
    #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
Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям
    #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
Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям
    #39508835
DevIgo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

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


и так далее
...
Рейтинг: 0 / 0
Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям
    #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
Как написать метод по поиску в коллекции объектов по разным полям и их комбинациям
    #39508873
DevIgo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

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


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