스트림변환 (1)

자바 스트림을 이용한 유용한 변환 방법

해당 게시글은 java의 stream을 이용하여 데이터를 쉽게 가공할 수 있는 방법을 정리 해놓은 문서로

유용한 케이스를 발견할 때마다 계속 업데이트할 예정입니다.

 

 

1. String배열을 int배열로 변환하기

int[] intArray = Stream.of(stringArray).mapToInt(Integer::parseInt).toArray();

2. Integer배열을 String배열로 변환하기

String[] stringArray = Stream.of(arr).map(String::valueOf).toArray(String[]::new);

3. String배열을 String리스트로 변환하기

String[] stringArray = new String[]{"!", "@", "#"};
List<String> stringList = Stream.of(stringArray).collect(Collectors.toList());

4. String리스트를 String배열로 변환하기

List<String> stringList = new ArrayList<>(Arrays.asList("!","@","#"));
String[] stringArray = stringList.toArray(new String[0]);

5. stream().map()을 이용한 객체(object) 변환하기

// 변환 전 클래스
@Getter
class Soldier {
  String name;
  int age;

  public Soldier(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

// 변환 대상 클래스
@Getter
class King {
  String name;
  int age;
  public King(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

// 샘플 Soldier stream 생성
Stream<Soldier> s = Stream.of(new Soldier("A", 18), new Soldier("B", 22), new Soldier("C", 19));

// map()을 이용하여 변환하기
List<King> k = s.map(soldier -> new King(soldier.getName(), soldier.getAge()))
		.collect(Collectors.toList());

 

6. filter()를 이용하여 필터링하기

// 변환 전 클래스
@Getter
class Soldier {
  String name;
  int age;

  public Soldier(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

// 변환 대상 클래스
@Getter
class King {
  String name;
  int age;
  public King(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

// 샘플 Soldier stream 생성
Stream<Soldier> s = Stream.of(new Soldier("Arthur", 18), new Soldier("Belisarius", 22), new Soldier("Caesar", 19));

// filter()를 이용하여 Arthur만 골라서 map()을 이용하여 King으로 변환하기
List<King> k = s.filter(soldier -> "Arthur".equals(soldier.getName()))
    .map(soldier -> new King(soldier.getName(), soldier.getAge()))
    .collect(Collectors.toList());

 

7. min() / max() 를 이용하여 comparator 기준 최소 / 최대 값을 갖는 객체 추출하기

    @Getter
    @Setter
    class Datapoint {
        private Double maximum;
    }
    
    public void sortStream() {
        List<Datapoint> datapoints = new ArrayList<>();
        int max = 10;
        datapoints.add(new Datapoint().withMaximum(Math.random() * max));
        datapoints.add(new Datapoint().withMaximum(Math.random() * max));
        datapoints.add(new Datapoint().withMaximum(Math.random() * max));
        log.debug("data points: {}", datapoints);

        // 객체 목록 중 특정 필드(maximum)값을 기준으로 최대값을 갖고 있는 객체 추출 (stream.max() 이용)
        Datapoint datapointMax = datapoints.stream()
                .max(Comparator.comparing(Datapoint::getMaximum))
                .orElse(new Datapoint().withMaximum(0D));
        log.debug("data point MAX: {}", datapointMax);

        // 객체 목록 중 특정 필드(maximum)값을 기준으로 최소값을 갖고 있는 객체 추출 (stream.min() 이용)
        Datapoint datapointMin = datapoints.stream()
                .min(Comparator.comparing(Datapoint::getMaximum))
                .orElse(new Datapoint().withMaximum(0D));
        log.debug("data point MIN: {}", datapointMin);
    }
    
    
    
    // 실행 로그
    data points: [{Maximum: 5.471390124016474,}, {Maximum: 2.7559360370945916,}, {Maximum: 0.5778257233234019,}]
    data point MAX: {Maximum: 5.471390124016474,}
    data point MIN: {Maximum: 0.5778257233234019,}