스트림 활용 (연습 문제)
실전 연습
➡️트랜잭션(거래)을 실행하는 거래자 예제를 살펴보자
- 2011년에 일어난 모든 트랜잭션을 찾아 값을 오름차순으로 정리하시오.
- 거래자가 근무하는 모든 도시를 중복 없이 나열하시오.
- 케임브리지에서 근무하는 모든 거래자를 찾아서 이름순으로 정렬하시오.
- 모든 거래자의 이름을 알파벳순으로 정렬해서 반환하시오.
- 밀라노에 거래자가 었는가 ?
- 케임브리지에 거주하는 거래자의 모든 트랜잭션값을 출력하시오.
- 전체 트랜잭션 중 최댓값은 얼마인가?
- 전체 트랜젹션 중 최솟값은 얼마인가 ?
Traderraoul =new Trader("Raoul", "Cambridge");
Tradermario =new Trader("Mario", "Milan");
Traderalan =new Trader("Alan", "Cambridge");
Traderbrian =new Trader("Brian", "Cambridge");
List<Transaction> transactions =Arrays.asList(
new Transaction(brian, 2011, 300),
new Transaction(raoul, 2012, 1000),
new Transaction(raoul, 2011, 400),
new Transaction(mario, 2012, 710),
new Transaction(mario, 2012, 700),
new Transaction(alan, 2012, 950)
1. 2011년에 일어난 모든 트랜잭션을 찾아 값을 오름차순으로 정리하시오.
List<Transaction> tr2011 = transactions.stream()
.filter(transaction->transaction.getYear() == 2011) // 2011년에 발생한 트랜잭션을 필터링하도록 프레디케이트를 넘겨준다.
.sorted(comparing(Transaction::getValue))//트랜잭션 value로 요소 정렬
.collect(toList());//결과 스트림의 모든 요소를 리스트로 변환
System.out.println(tr2011);
2. 거래자가 근무하는 모든 도시를 중복 없이 나열하시오.
List<String> cities = transactions.stream()
.map(transaction->transaction.getTrader().getCity())//트랜잭션과 관련한 각 거래자의 도시 추출
.distinct()//고유 도시만 선택
.collect(toList());//결과 스트림의 모든 요소를 리스트로 반환
System.out.println(cities);
3. 케임브리지에서 근무하는 모든 거래자를 찾아서 이름순으로 정렬하시오.
List<Trader> traders = transactions.stream()
.map(Transaction::getTrader)
.filter(trader->trader.getCity().equals("Cambridge"))
.distinct()
.sorted(comparing(Trader::getName))//결과 스트림의 거래자를 이름으로 정렬
.collect(toList());
System.out.println(traders);
4. 모든 거래자의 이름을 알파벳순으로 정렬해서 반환하시오.
String traderStr = transactions.stream()
.map(transaction->transaction.getTrader().getName())
.distinct()
.sorted()
.reduce("", (n1,n2) ->n1+n2);
System.out.println(traderStr);
System.out.println("방법.2");
System.out.println("----4. 모든 거래자의 이름을 알파벳순으로 정렬해서 반환하시오.--- ");
StringtraderStr2 = transactions.stream()
.map(transaction->transaction.getTrader().getName())
.distinct()
.sorted()
.collect(joining());
System.out.println(traderStr2);
5. 밀라노에 거래자가 있는가 ?
booleanmilanBased = transactions.stream()
.anyMatch(transaction->transaction.getTrader().getCity().equals("Milan"));
System.out.println(milanBased);
6. 케임브리지에 거주하는 거래자의 모든 트랜잭션값을 출력하시오.
transactions.stream()
.filter(t-> "Cambridge".equals(t.getTrader().getCity()))
.map(Transaction::getValue)//각 값을 출력
.forEach(System.out::println);//이 거래자들의 값 추출
7. 전체 트랜잭션 중 최댓값은 얼마인가?
Optional<Integer> highestValue = transactions.stream()
.map(Transaction::getValue) // 각 트랜잭션의 값 추출
.reduce(Integer::max); // 결과 스트림의 최댓값 계산
System.out.println(highestValue); // Optional[1000]
8. 전체 트랜젹션 중 최솟값은 얼마인가 ?
Optional<Integer> smallestTransaction = transactions.stream()
.map(Transaction::getValue)
.reduce(Integer::min);
System.out.println(smallestTransaction); // Optional[300]
System.out.println("방법.2");
System.out.println("----8. 전체 트랜젹션 중 최솟값은 얼마인가 ?----")
Optional<Transaction> smallestTransaction2 = transactions.stream()
.reduce((t1,t2) ->t1.getValue() <t2.getValue() ?t1:t2);//각 트랜잭션값을 반복 비교해서 가장 작은 트랜잭션 검색
System.out.println(smallestTransaction2); // Optional[Transaction{trader=Trader:Brian in Cambridge, year=2011, value=300}]
스트림 최대값이나 최솟값을 계산하는데 사용할 키를 지정하는 Comparator를 인수로 받은 min과 max 메소드를 제공한다
System.out.println("----스트림 최대값이나 최솟값을 계산하는데 사용할 키를 지정하는 Comparator를 인수로 받은 min과 max 메소드를 제공한다");
Optional<Transaction> smallTransaction = transactions.stream()
.min(comparing(Transaction::getValue));
System.out.println(smallTransaction);