Как применить Java Stream для существующих forEach l oop с условием if - PullRequest
0 голосов
/ 21 апреля 2020

Я новичок в потоке Java и могу использовать поток java в ArrayList. На этот раз я понятия не имею и пытаюсь с 2 часов. Я не понимаю никакой идеи. Я не уверен, даже если возможно использовать Java поток здесь. Может кто-нибудь, пожалуйста, направить меня? Я даже не знаю с чего начать. Как мне проверить наличие нижеуказанного условия transactions.getAvatarInfo() != null?

Это для l oop работает как положено. и мне нужно использовать Java Streams здесь вместо l oop. Я мог использовать Java Streams в другом цикле, это было прямо вперед. Здесь я даже не знаю с чего начать.

for (int i = 0; i < accountInfo.get().getTransactions().size(); i++) {

    Transactions transactions = accountInfo.get().getTransactions().get(i);
    AvatarInfo avatarInfo = new AvatarInfo ();
    if (transactions.getAvatarInfo() != null) {
        transations.setAvataruri(TransactionsConstant.PREFIX + 
            transactions.getAvatarInfo().getUserName().toLowerCase());
        transactions.getAvatarInfo().setUserName(transactions.getAvatarInfo ().getUsername());
    }
}

До сих пор я пробовал ниже, но это дает ошибку, говоря ; is expeccted после нуля. И если я добавлю, что будет еще одна ошибка.

accountInfo.get().getTransactions().stream().filter(a -> {
   AvatarInfo avatarInfo = new AvatarInfo ();
   a.getAvatarInfo() != null
})

Ответы [ 3 ]

2 голосов
/ 21 апреля 2020

Если у вас есть только одно выражение, вы можете написать лямбду, используя только это выражение, например:

a -> (a.getAvatarInfo() != null) // returns a boolean for filter

Однако, когда вы вводите {}, у вас есть полный встроенный метод, который имеет следовать всем нормальным синтаксисом для метода. В этом случае, поскольку ваша лямбда должна возвращать логическое значение, вам нужно

return a.getAvatarInfo() != null;

Однако бизнес new AvatarInfo() представляется совершенно ненужным и может быть удален, что позволяет использовать более простую форму.

0 голосов
/ 21 апреля 2020

Чтобы получить список, нам нужен коллектор, поэтому я думаю, что он должен быть таким:

transactions.stream()
            .filter(account -> account.getAvatarInfo() != null) 
            .collect(Collectors.toList()); 

В противном случае он будет возвращать только поток вместо списка.

0 голосов
/ 21 апреля 2020

ArrayList является Collection. Поскольку Java 8 Collection определяет метод stream(), который вернет Stream элементов вашего ArrayList.

См. https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#stream -

...