Как мне использовать streams / filters / lambdas из итератора и для цикла? - PullRequest
0 голосов
/ 02 апреля 2019

Я не слишком знаком с потоками, фильтрами и лямбдами, поскольку я привык писать старый код Java.Я хотел попробовать использовать новые вещи в новых версиях Java.Кажется, я не могу ничего начать без проблем с компиляцией.Спасибо за помощьсписок ниже с werdsejfksd отсутствует от ['aalaksdjf', 'erftghjuk', 'asdklgjaklgj', 'poijgndf']

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Ваш код работает нормально, если вы замените Obj на String и исправите ошибки компиляции:

List<String> a = Arrays.asList("werdsegs", "wsghnmrst", "vaasdfdas", "iujhgfds");
List<String> b = new ArrayList<>(Arrays.asList("aalaksdjf", "erftghjuk", "werdsejfksd", "asdklgjaklgj", "poijgndf"));

a.forEach((item) -> {
    String foo = item.substring(0,5);
    for (Iterator<String> i = b.iterator(); i.hasNext(); ) {
        String o = i.next();
        if (foo.equals(o.substring(0,5))) {
            i.remove();
        }
    }
});

System.out.println(b); // prints: [aalaksdjf, erftghjuk, asdklgjaklgj, poijgndf]

Как подсказал Джонатан Хайндл в другой ответ , вы можете упроститькод с помощью removeIf(...).Однако сначала я бы построил Set для повышения производительности:

List<String> a = Arrays.asList("werdsegs", "wsghnmrst", "vaasdfdas", "iujhgfds");
List<String> b = new ArrayList<>(Arrays.asList("aalaksdjf", "erftghjuk", "werdsejfksd", "asdklgjaklgj", "poijgndf"));

Set<String> set = a.stream().map(s -> s.substring(0,5)).collect(Collectors.toSet());
b.removeIf(s -> set.contains(s.substring(0,5)));

System.out.println(b); // prints: [aalaksdjf, erftghjuk, asdklgjaklgj, poijgndf]

Если вы хотите новый список, вместо изменения b, вы можете использовать filter(...) метод Stream:

List<String> a = Arrays.asList("werdsegs", "wsghnmrst", "vaasdfdas", "iujhgfds");
List<String> b = Arrays.asList("aalaksdjf", "erftghjuk", "werdsejfksd", "asdklgjaklgj", "poijgndf");

Set<String> set = a.stream().map(s -> s.substring(0,5)).collect(Collectors.toSet());
List<String> c = b.stream().filter(s -> ! set.contains(s.substring(0,5))).collect(Collectors.toList());

System.out.println(c); // prints: [aalaksdjf, erftghjuk, asdklgjaklgj, poijgndf]
0 голосов
/ 02 апреля 2019

Я так думаю

List<String> a = getListForA();    // ['werdsegs', 'wsghnmrst', 'vaasdfdas', 'iujhgfds']
List<String> b = getListForB();    // ['aalaksdjf', 'erftghjuk', 'werdsejfksd', 'asdklgjaklgj', 'poijgndf']

b.removeIf(bObj->a.stream().anyMatch(aObj->aObj.substring(0,5).equals(bObj.substring(0,5))));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...