a List
와 그 stream()
방법을 사용할 때 방금 질문을 받았습니다. 내가 알고 있지만 방법 을 사용하여, 나는 확신에 대한 아니에요 때 사용할 수 있습니다.
예를 들어, 다른 위치에 대한 다양한 경로가 포함 된 목록이 있습니다. 이제 주어진 단일 경로에 목록에 지정된 경로가 포함되어 있는지 확인하고 싶습니다. boolean
조건이 충족되었는지 여부에 따라 를 반환하고 싶습니다 .
물론 이것은 어려운 작업이 아닙니다. 하지만 스트림을 사용해야하는지, 아니면 for (-each) 루프를 사용해야하는지 궁금합니다.
목록
private static final List<String> EXCLUDE_PATHS = Arrays.asList(new String[]{
"my/path/one",
"my/path/two"
});
예-스트림
private boolean isExcluded(String path){
return EXCLUDE_PATHS.stream()
.map(String::toLowerCase)
.filter(path::contains)
.collect(Collectors.toList())
.size() > 0;
}
예-For-Each 루프
private boolean isExcluded(String path){
for (String excludePath : EXCLUDE_PATHS) {
if(path.contains(excludePath.toLowerCase())){
return true;
}
}
return false;
}
참고 것을 path
매개 변수는 항상 소문자 .
내 첫 번째 추측은 for-each 접근 방식이 더 빠르다는 것입니다. 조건이 충족되면 루프가 즉시 반환되기 때문입니다. 필터링을 완료하기 위해 스트림은 모든 목록 항목을 계속 반복합니다.
내 가정이 맞습니까? 그렇다면 왜 (또는 오히려 언제 ) 사용 stream()
합니까?
new String[]{…}
여기는 필요 없습니다 . 그냥 사용Arrays.asList("my/path/one", "my/path/two")
String[]
를) 호출 할 필요가 없습니다 Arrays.asList
. 을 사용하여 배열을 통해 스트리밍 할 수 있습니다 Arrays.stream(array)
. 덧붙여서 isExcluded
시험 의 목적을 모두 이해하는 데 어려움이 있습니다. 의 요소 EXCLUDE_PATHS
가 문자 그대로 경로 내 어딘가에 포함되어 있는지 정말 흥미로운가요 ? Ie isExcluded("my/path/one/foo/bar/baz")
는 true
뿐만 아니라 isExcluded("foo/bar/baz/my/path/one/")
...
Arrays.stream
좋습니다. 방법을 몰랐 습니다. 지적 해 주셔서 감사합니다. 사실, 제가 게시 한 예제는 저 외에 다른 사람에게는 쓸모가 없어 보입니다. 나는 그 isExcluded
방법 의 동작을 알고 있지만, 그것은 정말로 나 자신에게 필요한 것이므로 귀하의 질문에 대답하기 위해 : 예 , 범위에 맞지 않기 때문에 언급하고 싶지 않은 이유로 흥미 롭습니다. 원래 질문의.
toLowerCase
이미 소문자 인 상수에이 적용되는 이유는 무엇 입니까? path
논쟁에 적용되어야하지 않습니까?