새로운 방법의 대안은 코드 중복을 피하기 위해

마크 Sholund :

내가 다른 스트림에 동일한 작업을 적용 할 것 (순간에 자바 8을 사용)

배경 : 나는 티카에서 차원 데이터를 얻기 위해 노력하고 메타 데이터 오브젝트

다음 작동하지만 반복 코드 ( 메타 데이터 티카입니다 메타 데이터 개체) :

    private static void processDimensions(final Metadata metadata) {
        Optional<Integer> optWidth = Arrays.stream(new String[] {"tiff:ImageWidth", "Image Width"})
                .map(metadata::get)
                .filter(Objects::nonNull)
                .map(v -> v.replace("pixels", ""))
                .map(Integer::parseInt).findFirst();
        // do something with optWidth

        Optional<Integer> optHeight = Arrays.stream(new String[] {"tiff:ImageLength", "Image Height"})
                .map(metadata::get)
                .filter(Objects::nonNull)
                .map(v -> v.replace("pixels", ""))
                .map(Integer::parseInt).findFirst();
        // do something with optHeight
    }

나는하지 반복 코드를 않는이 시점에 입수했습니다 :

    private static void processDimensions(final Metadata metadata) {
        Optional<Integer> optWidth = processDimension(metadata, "tiff:ImageWidth", "Image Width");
        // do something with optWidth

        Optional<Integer> optHeight = processDimension(metadata, "tiff:ImageLength", "Image Height");
        // do something with optHeight
    }

    private static Optional<Integer> processDimension(final Metadata metadata, @NonNull final String... keys) {
        return Arrays.stream(keys).map(metadata::get).filter(Objects::nonNull).map(v -> v.replace("pixels", ""))
                .map(Integer::parseInt).findFirst();
    }

이 같은 별도의 방법이없는이 같은 일을 할 수 내부 기능입니다 processDimensions () ? 어떻게 표정이 것?

라빈 드라 Ranwala :

예 A와 선언 java.util.Function및 재사용.

Function<String[], OptionalInt> funct = keys -> Arrays.stream(keys)
    .map(metadata::get)
    .filter(Objects::nonNull)
    .map(v -> v.replace("pixels", ""))
    .mapToInt(Integer::parseInt)
    .findFirst();

다음은 호출 방법입니다.

funct.apply(strArr);

사실, 방법을 선언하는 등 훨씬 더 읽을 수있는 이름을 제공 processDimensions하고, 따라서 훨씬 더 읽기 나에게, 람다보다 설명적인 이름을 가진 매개 변수 유형을 선언합니다. 당신이 잘 스트림에 정통한하지 않는 한, 당신은 힘든 시간이 파이프 라인을 읽기를 찾을 수 있습니다. 또한, 방법은 사실상의 API를 정의하지만 스트림 파이프 라인은 일반적으로하지 않습니다.

추천

출처http://10.200.1.11:23101/article/api/json?id=3936&siteId=1