(각 요소) 자바 스트림 API를 오픈 가까운 자원에 대한 올바른 방법이 있나요?

user3913960 :

올바른 수행 사용 스트림 API를보다 컬렉션의 각 요소에 대해 약간의지도를 () 리소스를 열 방법, 필터 (), PEEK () 등 자원 및 주변보다 자원을 사용하여이 있습니까?

나는 이런 식으로 뭔가를 가지고 :

List<String> names =  getAllNames();
names.stream().map(n -> getElementFromName(n))
              .filter(e -> e.someCondition())
              .peek(e -> e.doSomething())
              .filter(e -> e.otherCondition())
              .peek(e -> e.doSomethingElse())
              .filter(e -> e.lastCondition())
              .forEach(e -> e.doTheLastThing());

나는 getElementFromName 방법의 리소스 (예 : DB 연결)를 개방하고있어 제외하고 이것은 잘 작동합니다. 그럼 난 someCondition 또는 해봐요 같은 다른 인스턴스 메서드에서 해당 자원과 함께 일하고 있어요. 그리고 내가 제대로 종료하는 방법을 모른다.

나는 스트림에서만 중간 작업을 사용하고 있음을 알고있다. 모든 방법이 foreach는 작업을 평가하고 반복 한 번만 수행되므로 성능이 확인을해야한다는 어떤 수단.

하지만 난 getElementFromName 방법의 각 요소에 대해 연 자원을 닫는 방법을 알아낼 수 없습니다.

나는 getElementFromName 만든 모든 요소의 목록을 저장하고 나중에 자원을 닫을 수 있습니다. 하지만 난 그냥, 공간을 낭비 살아있는 모든 자원을 유지하는 것입니다. 또한, 요소의리스트를 통해 두 번째 반복이있을 것이다. 이는이 경우에 바람직 스트림 API를 회피한다. 내가 요소를 사용하여 수행하고있을 때 너무 가까이 든 자동차에 대한 방법은 자원이있다?

또한 내가 쉽게 foreach는 lopp을 사용하여 수행 할 수 있습니다, 알고는 스트림 API를 사용하여 수행 할 수 있다면, 난 그냥 궁금 해서요.

홀거 :

당신은 사용할 수 있습니다 flatMap그것을 위해 :

.flatMap(n -> {
    YourResource r = getElementFromName(n);
    return Stream.of(r).onClose(r::close);
})

이 반환 된 요소에 의해 캡슐화 된 자원이 있다고 가정 close()방법을. 그렇지 않은 경우, 코드는 더 복잡해진다하지만, 사진이 명확해야한다. 대신에 단지 하나의 객체를 반환, 당신은 누구의 단일 요소 스트림 반환하고 onClose작업에 필요한 정리를 수행합니다. 이 체크 된 예외를 던질 수 있다면, 당신은 또한 바람직 체크되지 않는 예외의 예외를 랩하고, 그에 대한 처리기를 추가해야합니다.

이 위해 만든 보증에 의존한다 flatMap:

각각의 매핑 된 스트림은 closed그 내용이 스트림에 배치 된 후.

그러나 일반적으로,이 코드, 특히 남용 엿보기는 매우 의심스러운.

추천

출처http://43.154.161.224:23101/article/api/json?id=180533&siteId=1