Java

[java] 자주쓰는 람다식 Lambda (stream 인터페이스) 예제

dev.mk 2023. 2. 12. 22:09
반응형

게시판 목록에서 게시물 제목이 "중"으로 시작하는 것을 모두 추출

//게시판 목록
List<BbsDto> list = bbsDao.selectListAllBbs();


//	filter 메서드는 컬렉션을 조건에 의한 선택을 할때 유용하다.
//	filter 메서드는 boolean 결과를 리턴하는 람다 표현식이 필요하다.
//	예제의 collection 메서드는 filter 표현식에 나온 값을 list로 변경한다.
//	게시판 제목이 '중'로 시작하는 배열을 모두 출력

final List<BbsDto> result_startsWithS = 
    list.stream().filter(v -> v.getTitle().startsWith("중"))
    .collect(Collectors.toList());
    
log.info(result_startsWithS.toString());

 

게시판 목록에서 게시판번호가 50보다 큰것 모두 추출

//게시판 목록
List<BbsDto> list = bbsDao.selectListAllBbs();

//게시판번호가 50보다 큰것 모두 추출하기
List<BbsDto> result_example = list.stream()
    .filter(v -> v.getBno() > 50)
    .collect(Collectors.toList());
    
log.info(result_example.toString());

 

게시판 목록에서 제목이 "중복"이고 게시물번호가 100보다 큰것 모두 추출하기

//제목이 중복이고 게시판번호가 100보다 큰것 모두 추출하기
List<BbsDto> result_example2 = list.stream()
    .filter(v -> "중복".equals(v.getTitle()) && v.getBno() > 100)
    .collect(Collectors.toList());

 

리스트내에서 name키의 중복되는 값이 있을경우 해당 열 제거하기

// Vo 작성
public class Member {
    private int id;
    private String name;
    private String phone;
}

// 리스트에 넣기 1.방법
List<Member> members = Arrays.asList(
    new Member(1, "김유신", "010-1234-5678"),
    new Member(2, "이순신", "010-2345-6789"),
    new Member(3, "유관순", "010-3456-7890"),
    new Member(1, "김유신", "010-1234-4321"),
    new Member(2, "이순신", "010-2345-5555")
);

// 리스트에 넣기 2.방법
List<Member> members = List.of(
    new Member(1, "김유신", "010-1234-5678"),
    new Member(2, "이순신", "010-2345-6789"),
    new Member(3, "유관순", "010-3456-7890"),
    new Member(1, "김유신", "010-1234-4321"),
    new Member(2, "이순신", "010-2345-5555")
);

둘의 차이는?

List.of와 Arrays.asList는 두 가지 다른 방법으로 리스트를 생성하는 데 사용되는 메서드이다. 
그러나 이들 간에 몇 가지 중요한 차이점이 있다.

1. 가변성 (Mutability):
List.of: 반환된 리스트는 불변(immutable)이다. 따라서 요소를 추가하거나 제거하는 것이 불가능하다.
Arrays.asList: 반환된 리스트는 고정 크기로, 크기를 변경할 수 없지만 내부 배열은 수정 가능하다. 즉, 요소의 값을 변경하는 것은 가능하지만, 크기를 변경하는 것은 불가능하다.

2. Null 처리:
List.of: null 값을 요소로 사용하려고 시도하면 NullPointerException이 발생한다.. 이 메서드는 요소로 null을 허용하지 않는다.
Arrays.asList: null 값을 요소로 사용할 수 있다.

3. 원본 배열과의 관계:
List.of: 내부적으로는 새로운 객체를 생성하며, 원본 배열과의 관계가 없다.
Arrays.asList: 반환된 리스트는 원본 배열에 대한 뷰(view)이므로, 리스트를 수정하면 원본 배열도 변경된다. 반대로, 원본 배열을 수정하면 리스트에도 영향을 미친다.


// List.of 예제
List<String> immutableList = List.of("A", "B", "C");
// 아래 주석 처리된 코드는 UnsupportedOperationException 발생
// immutableList.add("D");

// Arrays.asList 예제
List<String> fixedSizeList = Arrays.asList("A", "B", "C");
// 아래 주석 처리된 코드는 가능하지만, 크기 변경 불가능
// fixedSizeList.set(0, "D");
// fixedSizeList.add("E");  // UnsupportedOperationException 발생

// null 처리
List<String> nullableList = Arrays.asList("A", null, "C"); // 가능
// List<String> nonNullableList = List.of("A", null, "C"); // NullPointerException 발생

 

 

List<Members> distinctMembers = targetList.stream()
    .collect(Collectors.toMap(Members::getMemberName, item -> item, (existing, replacement) -> existing))
    .values()
    .stream()
    .collect(Collectors.toList());

 

반응형