Java 스트림에 대해 읽고 새로운 진행 사항을 발견하고 있습니다. 내가 찾은 새로운 것 중 하나는 peek()
기능이었습니다. peek에서 읽은 거의 모든 것이 스트림을 디버깅하는 데 사용해야한다고 말합니다.
각 계정에 사용자 이름, 비밀번호 필드 및 login () 및 logsIn () 메소드가있는 스트림이있는 경우 어떻게해야합니까?
나도
Consumer<Account> login = account -> account.login();
과
Predicate<Account> loggedIn = account -> account.loggedIn();
왜 이것이 그렇게 나쁠까요?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
이제 내가 알 수있는 한 정확히 의도 된 작업을 수행합니다. 그것;
- 계정 목록을 가져옵니다
- 각 계정에 로그인을 시도합니다
- 로그인하지 않은 계정을 걸러냅니다
- 로그인 한 계정을 새로운 목록으로 수집
이런 식의 단점은 무엇입니까? 진행하지 말아야 할 이유가 있습니까? 마지막 으로이 솔루션이 아니라면 무엇입니까?
이것의 원래 버전은 다음과 같이 .filter () 메소드를 사용했습니다.
.filter(account -> {
account.login();
return account.loggedIn();
})
forEach
작업은와 반대로 원하는 작업이 될 수 있으므로이 순서대로 요청 합니다 peek
. API에 있다고해서 (예 :와 같은 Optional.of
) 악용으로 공개되지 않았다는 의미는 아닙니다 .
.peek(Account::login)
and 일 수 있습니다 .filter(Account::loggedIn)
. 이와 같은 다른 메소드를 호출하는 Consumer and Predicate를 작성할 이유가 없습니다.
forEach()
와 peek()
만 부작용을 통해 동작 할 수있다; 이들은주의해서 사용해야합니다. ”. 내 말은 것을 상기시켜 더이었다 peek
(디버깅 목적을 위해 설계) 작업이 같은 다른 작업 내에서 같은 일을하고로 대체되어서는 안 map()
나 filter()
.