시그마 삽질==six 시그마

Stream collect 1탄 본문

프로그래밍/Java

Stream collect 1탄

Ethan Matthew Hunt 2020. 8. 27. 17:13
해당글은 신용권님의 '이것이 자바다' 를 토대로 작성되었습니다.

예전에 남궁성님의 '자바의 정석' 그리고 신용권님의 '이것이 자바다' 두권다 보았는데

저는 개인적으로 신용권님의 책이 좀 더 핵심을 찌르고 직관적이어서 좋았던거 같습니다.

책은 요기에서 구매 가능합니다.

 

.stream().collect(Collectors.toMap(xxxx:getId, Functions.identity()));

 

Stream의 collect (Collector<T,A,R> collector) 메소드는 필터링 또는 매핑된 요소들을 새로운 컬렉션에 수집하고(그루핑,집계) 이 컬랙션을 리턴한다

 

Java util.stream 패키지의 Stream 인터페이스의 collect 메소드

Java util.stream 패키지의 tream 인터페이스의 collect 메소드의 매개변수인 -->Java util.stream 패키지의  인터페이스 Colletor

Java util.stream 패키지의 인터페이스 Colletor---> 의 구현체  Java util.stream 패키지의 Collectors의 정적메소드

 

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collector.html

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html

 

 

리턴 타입 메소드(매게 변수) 인터페이스
R collect(Collertor<T,A,R> collector) Stream

 

매개값인 Collector(수집기)는 어떤 요소를 어떤 컬랙션에 수집할 것인지 결정함

Collector의 타입 파라미터 T는 요소이고 A는 누적기다. 그리고 R은 요소가 저장될 컬렉션임. 즉 T요소를 A누적기가 R에 저장한다는 뜻

Collector의 구현 객체는 Collectors 클래스의 다양한 정적 메소드를 이용해서 얻을 수 있음

 

 

 

리턴타입 Collectors의 정적메소드 설명
Collector<T,?,List<T>> toList() T를 List에 저장
Collector<T,?,Set<T>> toSet() T를 set에 저장
Collector<T,?,Collection<T>> toCollection(Supplier<CollectionT>>) T를 Supplier가 제공한 Collection에 저장
Collector<T,?,Map<K,U>> toMap(
Function<T,K> keyMapper,
Function<T,U> valueMapper)

T를 K와 U로 매핑해서 K를 키로,
U를 값으로 Map에 저장
Collector<T,?,ConcurrentMap<K,U>> toConcurrentMap(
Function<T,K> keyMapper,
Function<T,U> valueMapper)
T를 K와 U러 메핑해서 K를 키로,
U를 값으로 ConcurrentMap에 저장

 

 

 

@Data
@AllArgsConstructor
public class Student {

	private String name;
	private int score;
	private Gender gender;
	private City city;
	
	public Student(String name, int score, Gender gender) {
		this.name = name;
		this.score = score;
		this.gender = gender;
	}	
}


public enum  Gender {
     MALE
    , FEMALE
}

public enum City {
    Seoul
    , Pusan
}


@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor


public class GenderDto {
	private Gender gender;
	private List<Student> students;

}

 

 

@Test
    public void collectTest() throws Exception {
        List<Student> totalList = Arrays.asList(
                new Student("공유", 6, Gender.MALE),
                new Student("김태희", 6, Gender.FEMALE),
                new Student("원빈", 10, Gender.MALE),
                new Student("전지현", 10, Gender.FEMALE)
        );


        List<Student> maleList = totalList.stream()
                .filter(s->s.getGender()==Gender.MALE)
                .collect(Collectors.toList());
        maleList.stream()
                .forEach(s -> System.out.println(s.getName()));

       System.out.println("=================================");
        

        Map<Gender, Student> collect = totalList.stream()
                .filter(s -> Objects.equals(s.getGender(),Gender.MALE)  && Objects.equals(s.getScore(),6))
                 //.collect(Collectors.toMap(y->y.getGender(), x -> x, (x, y) -> x)); //키에 값이 두개 이상이면 첫번째꺼 가져옴
                .collect(Collectors.toMap(Student::getGender, Function.identity(), (x, y) -> x)); //키에 값이 두개 이상이면 첫번째꺼 가져옴
                //.collect(Collectors.toMap(Student::getGender, Function.identity()));//키에 값이 두개 이상이면 IllegalStateException
				//.collect(Collectors.toMap(Student::getGender, Student::getScore)); 
        System.out.println("collect:"+collect);
        System.out.println("=================================");
        collect.forEach((k,v)-> System.out.println("k:"+k+"  v:"+v));
        System.out.println("=================================");
        

        Set<Student> femaleSet = totalList.stream()
                .filter(s -> s.getGender() == Gender.FEMALE)
                //.collect(Collectors.toCollection(HashSet :: new));
                //.collect( Collectors.toCollection(()->{return new HashSet<Student>();}) );
                .collect(Collectors.toCollection(() -> new HashSet<Student>()));
        femaleSet.stream()
                .forEach(s -> System.out.println(s.getName()));
    }

 

 

결과


공유
원빈
=================================
collect:{MALE=Student(name=공유, score=6, gender=MALE, city=null)}
=================================
k:MALE v:Student(name=공유, score=6, gender=MALE, city=null)
=================================
김태희
전지현


 

 

 

 

Comments