자바 8 : 기능적인 방법은 일종의 쓰기 필터와 같은 시간에 계산하기

Dipmcng :

나는 자바에 아주 새로운 오전, 나는 기능적인 방법으로 아래의 로직을 작성하려합니다.

나는 많은 필드가 객체의 목록을 가지고있다. List<someObject>지금은 관심의 필드는 long timestampString bookType

문제 문이다 - 나는 같은이 주어진 목록에있는 객체의 수의 수를 찾으려면 bookType가장 낮은 타임 스탬프와 하나를.

예를 들어, 경우 종류에 따라 객체의 주어진 목록을 timestamp오름차순으로, 그리고 정렬 된 목록의 첫 번째 목적은이 bookType분야로 SOMETYPE; 그때는 함께 목록에 얼마나 많은 개체 발견 할bookType SOMETYPE

나는이 개 임시 변수를 maintaing 후 가장 낮은 찾을 일단 목록을 통해 반복함으로써 평범한 구식 비 기능적인 방법을 사용하여이 논리를 작성한 timestamp와 해당 bookType각각의 카운트 AMDbookType

그것이 될 변수를 필요로하지만이, 람다에서 실행하는 것이 허용되지 않습니다 final

내가 사용하여 지정된 목록을 정렬 할 수있는 곳 나는 부분 만 쓸 수 timestamp

n.stream().sorted(Comparator.comparingLong(someObject::timestamp)).collect(Collectors.toList());

나는 가장 낮은 수를 찾아 진행하는 방법에 붙어 timestamp bookType

m.antkowicz :

그러나 그것이 마지막이 될 변수를 필요로, 람다에서 실행되도록 허용되지 않습니다

첫째 - 이것은 당신이 당신의 변수를 만들 수 있기 때문에 문제가되지 않는다 효과적으로 최종 예를 들면 만들어. 단일 항목 어레이 및 람다의 하나 (제 1) 개체를 전달할

이것에 대해 생각 찾는 방법을 논리적으로 - 두 번째 것은 하나의 람다 모든 것을 넣어 아무 의미가 기본적으로 거기에 없다는 것입니다 min값이 어떤 속성에 의해 그룹화 된 객체 계산과 연결되어 있습니까? 하지 않습니다 - 당신의 코드를 당황하게됩니다 하나 개의 스트림에 (어떻게 든)이 퍼팅

당신이 무엇을해야 - 당신은 찾을 방법을 준비해야 min가치와 그것의 당신을 반환 bookType한 후 스트림 수집 및 그룹을하여 bookType키 값을 주어로하고 컬렉션의 반환 크기를

그것은이 처음에 같이 볼 수 있었다 :

public class Item {
    private final long timestamp;
    private final String bookType;

    // Constructors, getters etc
}

// ...

public int getSizeOfBookTypeByMinTimestamp() {
    return items.stream()
        .collect(Collectors.groupingBy(Item::getBookType))
        .get(getMin(items))
        .size();
}

private String getMin(List<Item> items) {
    return items
        .stream()
        .min(Comparator.comparingLong(Item::getTimestamp))
        .orElse( /* HANDLE NO OBJECT */ ) // you can use also orElseThrow etc
        .getBookType();
}

추천

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