고코딩

스트림 실습 문제 8개(매우 기초) 본문

JAVA

스트림 실습 문제 8개(매우 기초)

고코딩 2021. 5. 14. 16:39

모던 자바 인 액션 이라는 책을 공부하면서 풀었던 스트림 기초 문제 입니다.

기본적으로

  • Trader
  • Transaction

2가지 클래스가 정의되어 있어야 합니다.

Trader

public class Trader {
    private final String name;
    private final String city;
    public Trader(String n, String c){
        this.name = n;
        this.city = c;
    }

    public String getName() {
        return name;
    }

    public String getCity() {
        return city;
    }

    @Override
    public String toString() {
        return "trader:"+this.name+" in "+this.city;
    }
}

Transaction

public class Transaction{
    private final Trader trader;
    private final int year;
    private final int value;

    public Transaction(Trader trader, int year, int value){
        this.trader = trader;
        this.year = year;
        this.value = value;
    }

    public Trader getTrader() {
        return trader;
    }
    public int getYear(){
        return year;
    }
    public int getValue(){
        return value;
    }

    @Override
    public String toString() {
        return "Transaction{" +
                "trader=" + trader +
                ", year=" + year +
                ", value=" + value +
                '}';
    }
}

기본 데이터를 추가해 줍시다.

public static void main(String[] args) throws IOException {
    Trader raoul = new Trader("Raoul", "Cambridge");
        Trader mario = new Trader("Mario", "Milan");
        Trader alan = new Trader("Alan", "Cambridge");
        Trader brian = 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년에 일어난 모든 트랜잭션을 찾아 값을 오름차순으로 정리하시오.
  2. 거래자가 근무하는 모든 도시를 중복없이 나열하시오
  3. 케임브리지에서 근무하는 모든 거래자를 찾아서 이름순으로 정렬하시오
  4. 모든 거래자의 이름을 알파벳순으로 정리해서 반환하시오
  5. 밀라노에 거래자가 있는가?
  6. 케임브리지에 거주하는 거래자의 모든 트랜잭션값을 출력하시오
  7. 전체 트랜잭션 중 최댓값은 얼마인가?
  8. 전체 트랜잭션 중 최솟값은 얼마인가?

정답

1.

List<Transaction> transactions1= transactions.stream()
                    .filter(transaction -> transaction.getYear() == 2011)   //2011년에 발생한 트랜잭셩르 필터링하도록 프레디케이트를 넘겨줌
                    .sorted(comparing(Transaction::getValue))   //트랜잭션값으로 요소 정렬
                    .collect(toList()); //결과 그트림의 모든 요소를 리스트로 반환
        System.out.println(transactions1);

2.

List<String> transactions2 = transactions.stream()
                    .map(Transaction::getTrader)
                    .map(Trader::getCity)
                    .distinct()
                    .collect(toList());
        System.out.println(transactions2);

3.

List<Trader> transactions3 = transactions.stream()
                    .filter(transaction -> transaction.getTrader().getCity().equals("Cambridge"))
                    .map(Transaction::getTrader)
                    .sorted(comparing(Trader::getName))
                    .distinct()
                    .collect(toList());
        System.out.println(transactions3);

4.

String transcation4 = transactions.stream()
                    .map(transaction -> transaction.getTrader().getName())
                    .distinct()
                    .sorted()
                    .reduce("", (n1,n2)->n1+n2);
        System.out.println(transcation4);

5.

boolean transaction5 = transactions.stream()
                    .anyMatch(transaction -> transaction.getTrader().getCity().equals("Millano"));
        System.out.println(transaction5);

6.

List<Integer> transaction6 = transactions.stream()
                    .filter(transaction -> transaction.getTrader().getCity().equals("Cambridge"))
                    .map(Transaction::getValue)
                    .collect(toList());
        System.out.println(transaction6);

7.

Optional<Integer> transaction7 = transactions.stream()
                    .map(Transaction::getValue)
                    .reduce(Integer::max);
        if(transaction7.isPresent()){
            System.out.println(transaction7.get());
        }

8.

Optional<Integer> transaction8 = transactions.stream()
                .map(Transaction::getValue)
                .reduce(Integer::min);
        if(transaction8.isPresent()){
            System.out.println(transaction8.get());
        }

'JAVA' 카테고리의 다른 글

slg4j java 실행시 에러 원인x 해결만  (0) 2021.06.16
[JAVA] JNDI란?  (0) 2021.05.26
[JAVA] 람다는 무엇일까?  (0) 2021.05.13
[JAVA] Collection 관계  (0) 2021.04.07
[JAVA] JDK JRE JVM 관계  (0) 2021.04.05