본문으로 건너뛰기

스트림 기본연습3

중간에 null이 있는 객체를 스트림으로 연산하려고 하면??

  • getMembersNullList 중간중간 null이 박혀있는 리스트
  • getMembersAllAgeNullList age가 전부 null인 리스트

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Member {

private Integer id;

private String name;

private Integer age;

private String gender;

private String location;

private Integer memberLevel;

private BigDecimal price;

public static List<Member> getMembersNullList() {

return Arrays.asList(
new Member(1, "cavin", 15, "male", "Tokyo", 5, new BigDecimal("110.1548")),
new Member(2, "james", 21, "male", "Seoul", 5, new BigDecimal("110.1548")),
new Member(3, "lucy", null, "female", "Pusan", null, new BigDecimal("110.1548")),
new Member(4, "bob", 25, "male", "Tokyo", 4, new BigDecimal("110.1548")),
new Member(5, "david", 40, "male", "Tokyo", null, new BigDecimal("110.1548")),
new Member(6, "susan", null, "female", "Seoul", 2, new BigDecimal("110.1548")),
new Member(7, "cherky", 7, "male", "Seoul", 1, new BigDecimal("110.1548")),
new Member(8, "keeth", 12, "male", "Seoul", null, new BigDecimal("110.1548")),
new Member(9, "can", 11, "female", "Seoul", 3, new BigDecimal("110.1548")),
new Member(10, "mantis", null, "male", "Tokyo", 1, null),
new Member(11, "jenkins", 34, "male", "Seoul", 1, new BigDecimal("110.1548"))
);
}

public static List<Member> getMembersAllAgeNullList() {

return Arrays.asList(
new Member(1, "cavin", null, "male", "Tokyo", 5, new BigDecimal("110.1548")),
new Member(2, "james", null, "male", "Seoul", 5, new BigDecimal("110.1548")),
new Member(3, "lucy", null, "female", "Pusan", 5, new BigDecimal("110.1548")),
new Member(4, "bob", null, "male", "Tokyo", 4, new BigDecimal("110.1548")),
new Member(5, "david", null, "male", "Tokyo", 4, new BigDecimal("110.1548")),
new Member(6, "susan", null, "female", "Seoul", 2, new BigDecimal("110.1548")),
new Member(7, "cherky", null, "male", "Seoul", 1, new BigDecimal("110.1548")),
new Member(8, "keeth", null, "male", "Seoul", 3, new BigDecimal("110.1548")),
new Member(9, "can", null, "female", "Seoul", 3, new BigDecimal("110.1548")),
new Member(10, "mantis", null, "male", "Tokyo", 1, null),
new Member(11, "jenkins", null, "male", "Seoul", 1, new BigDecimal("110.1548"))
);
}

}

public class App {
public static void main(String[] args) {

// 이렇게 하면 null포인터 에러난다.
// Integer sumMemberNullableAge = Member.getMembersNullList().stream()
// .map(Member::getAge)
// .reduce(0, Integer::sum);
// System.out.println("중간에 null 이 존재하는 멤버들의 나이 총합");
// System.out.println(sumMemberNullableAge);

// 이렇게 처음에 필터로 null이 아닌 데이터만 필터링 해주고, 필터링 된 데이터(null없는놈들)로 연산해주면 된다
Integer sumMemberNullableAge = Member.getMembersNullList().stream()
.filter(s -> s.getAge() != null)
.map(Member::getAge)
.reduce(0, Integer::sum);
System.out.println("중간에 null 이 존재하는 멤버들의 나이 총합");
System.out.println(sumMemberNullableAge);


/////////////// 모든 나이값이 null 이고 그것의 합계를 내면 ??? //////////////////////

// 이경우는 에러없이 0으로 나온다!!
Integer sumMemberAllAgeNull = Member.getMembersAllAgeNullList().stream()
.filter(s -> s.getAge() != null)
.map(Member::getAge)
.reduce(0, Integer::sum);
System.out.println("모든 age값이 null 이고 그것을 더하면 ?");
System.out.println(sumMemberAllAgeNull);


////////////////////////////////////////////////////////////
/////// 중간중간 null 이 박혀있다. 그걸 필터링해서 돌려보자
/////////////////////////////////////////////////////////

// 멤버 레벨이(중간에 null있음) 1인 사람들의 나이 합계를 구하자(나이값 null인 애가 있음)
Integer sumMemberAge = Member.getMembersNullList().stream()
// 이렇게 하면 당연히 에러
// .filter(s -> s.getMemberLevel() == 1)
// .map(s -> s.getAge())
// .reduce(0, Integer::sum);

// 이렇게 해도 에러. getAge에서 null포인터 뜸.
// .filter(s -> s.getMemberLevel() != null)
// .filter(s -> s.getMemberLevel() == 1)
// .map(s -> s.getAge())
// .reduce(0, Integer::sum);

// 요렇게 해야한다
.filter(s -> s.getMemberLevel() != null)
.filter(s -> s.getMemberLevel() == 1)
.filter(s -> s.getAge() != null)
.map(s -> s.getAge())
.reduce(0, Integer::sum);

System.out.println("중간중간 null 이 있는 데이터");
System.out.println(sumMemberAge);

// 위에 코드를 조금더 간결하게 써보자
Integer sumMemberAge2 = Member.getMembersNullList().stream()

.filter(s -> s.getMemberLevel() != null && s.getMemberLevel() == 1)
.filter(s -> s.getAge() != null)
.map(Member::getAge)
.reduce(0, Integer::sum);

System.out.println("중간중간 null 이 있는 데이터");
System.out.println(sumMemberAge2);
}
}

전부 null인 리스트를 합계로 냈을 경우에는 에러없이 0이 되더라..
중간중간 null이 박혀있는 애들은 필터로 != null 식으로 한번 걸러준다음에 사용해야 한다.