stream

kmb·2021년 8월 13일
0

자바

목록 보기
27/31
post-thumbnail

stream

연산을 도와주기위한 인터페이스. 배열 연산할때 많이 사용한다.
(이전에는 iterator 구분자를 이용했지만 너무 복잡해서 stream을 사용)

stream의 사용 단계

1) 데이터소스를 가져온다. (ex. 변수 intList안에 있는 값들)
2) 중간연산 진행 (filter, map, mapToInt, ... 등등)
3) 최종연산 (forEach, collect, sum, reduce, ... 등등)

타입비교

Consumer( Type -> void ) ex) sout, forEach
vs
Supplier( ( ) -> Type )

 

Predicate( Type -> boolean ) ex) filter
vs
Function( Type -> 또다른 객체 ) ex) map, mapToObject

Collectors


stream 테스트 진행을 위해 Member 클래스에 변수를 지정해준다

public class Member {
	
  private String name;
  private Integer age;
  private Gender gender;
	
  public Member(String name, Integer age, Gender gender) {
	super();
	this.name = name;
	this.age = age;
	this.gender = gender;
  }

  public String getName() {
	return name;
  }

  public void setName(String name) {
	this.name = name;
  }

  public Integer getAge() {
	return age;
  }

  public void setAge(Integer age) {
	this.age = age;
  }

  public Gender getGender() {
	return gender;
  }

  public void setGender(Gender gender) {
	this.gender = gender;
  }

  @Override
  public String toString() {
	return "Member [name=" + name + ", age=" + age + ", gender=" + gender + "]";
  }

}

이때 성별은 Enum 타입으로 지정해준다

public enum Gender {

  MALE("남자"), 
  FEMALE("여자");
	
  private final String desc;
	
  Gender(String desc) {
 	this.desc = desc;
  }
	
  public String getGender() {
	return desc;
  }
}
public class Stream_test {

  public static void main(String[] args) {

  // 문제1>짝수만 추출하고 제곱하고 모두 더해라
  List<Integer> intList = Arrays.asList(1,2,3,4,5,6);
		
  // 1)
  var sum = intList.stream()
	 .filter(i -> i%2==0)
	 .map(d -> d*d)
	 .reduce(0, Integer::sum);  // 내부의 ::sum은 메서드이다
		
  System.out.println("sum : " + sum);  // 4 + 16 + 36 = 56
		
  // 2) integer stream  -->  IntStream, rangeClosed(시작, 끝) : 범위를 지정
  var sum2 = IntStream.rangeClosed(1, 6)
	  .filter(i -> i%2==0)
	  .map(d -> d*d)
	  .reduce(0, Integer::sum);
		
  System.out.println("sum2 : " + sum2);  // 4 + 16 + 36 = 56
		
		
  // 문제2> 남자인 사람의 나이 평균을 구해라
  List <Member> memList = Arrays.asList(
	new Member("dsg", 24, Gender.MALE),
	new Member("kmb", 31, Gender.MALE),
	new Member("ibk", 28, Gender.FEMALE),
	new Member("aaa", 37, Gender.FEMALE),
	new Member("bbb", 24, Gender.FEMALE)
  );
		
		
  var average = memList.stream()
	  .filter(m -> m.getGender() == Gender.MALE)
	  .map(m -> m.getAge())
	  .mapToDouble(d -> d)	 // 실수화
	  .average();
		
  System.out.println("average : " + average.orElse(0.0));
		
		
  // 문제3> 여자인 사람의 이름을 역순으로 정렬(알파벳순)해라
  var collect = memList.stream()
	  .filter(m -> m.getGender() == Gender.FEMALE)
	  .map(i -> i.getName())
	  .sorted(Comparator.reverseOrder())  // .sort() : 정렬 메서드 
	  .collect(Collectors.toList());
		
  System.out.println("collect : " + collect);
		
		
  // 문제4> 중복제거해서 숫자를 가져올때
  List<Integer> intList2 = Arrays.asList(1,2,2,2,3,4,5,6,9,9,9);
		
  intList2.stream()
	  .filter(i -> i%2 !=0)
	  .distinct()
	  .forEach(System.out::println);
		
		
  // 문제5> javalist에 있는 사람이름을 뽑아라
  List <Member> javalist = Arrays.asList(
	new Member("dsg", 24, Gender.MALE),
	new Member("kmb", 31, Gender.MALE),
	new Member("ibk", 28, Gender.FEMALE)
  );
		
  List <Member> springlist = Arrays.asList(			
	new Member("aaa", 37, Gender.FEMALE),
	new Member("bbb", 24, Gender.FEMALE)
  );
		
  List<List<Member>> students = new ArrayList<>();
				
  	students.add(javalist);
	students.add(springlist);
				
	students.stream()
		.flatMap(s -> s.stream())
	//	.filter(s -> s.getName())
		.map(s -> s.getName())
		.forEach(System.out::println);
	}
}

 
출력 결과는 아래와 같다.

profile
꾸준하게

0개의 댓글