본문 바로가기

Language/Java

[JAVA] Stream 실습

1. 코드리뷰

// "python", "java", "javascript","c","c++","c#"
// C로 시작하는 프로그래밍 언어 추출
/*	.startsWith()는 String 클래스의 매소드로서 ()안의 값이 문자열에 있는지를 boolean으로 반환
	.filter()는 ()안의 조건에 맞는 요소만 골라서 만든 새 스트림을 반환 */
Arrays.stream(langs).filter(x-> x.startsWith("c")).forEach(System.out::println);
System.out.println("-----------------------------------------");

// java 라는 글자를 포함하는 언어
Arrays.stream(langs).filter(x-> x.contains("java")).forEach(System.out::println);
System.out.println("-----------------------------------------");

// 4글자 이하의 언어를 뽑아서 정렬한 뒤 출력
/*컬렉션 프레임워크는 클래스에 stream 만드는 매소드가 따로 있어서 객체는 그거 쓰면 된다.*/
langList.stream().filter(x-> x.length()<=4).sorted().forEach(System.out::println);
System.out.println("-----------------------------------------");

//4글자 이하의 언어 중에서 c 라는 글자를 포함하는 언어
langList.stream()
        .filter(x -> x.length()<=4)
        .filter(x -> x.contains("c"))
        .forEach(System.out::println);
System.out.println("-----------------------------------------");

// 4글자 이하의 언어 중에서 c라는 글자를 포함하는 언어가 하나라도 있는지 여부
// anymatch: ()안의 조건을 스트림의 데이터 중 하나라도 만족하면 true 반환
// allmatch: ()안의 조건을 스트림의 데이터들이 전부 만족하면 true 반환
boolean anyMatch = langList.stream()
        .filter(x->x.length()<=4)
        .anyMatch(x-> x.contains("c"));
System.out.println(anyMatch);
System.out.println("-----------------------------------------");

// 3글자 이하의 언어들은 모두 c라는 글자를 포함하는지 여부
boolean allMatch = langList.stream()
        .filter(x->x.length()<=3)
        .allMatch(x-> x.contains("c"));
System.out.println(allMatch);
System.out.println("-----------------------------------------");

// 4글자 이하의 언어 중에서 c라는 글자를 포함하는 언어 뒤에 (어려워요) 라는 글자를 함께 출력
// map()은 스트림의 요소들을 함수의 인수로 전달한다. 해당 함수의 반환값들로 새 스트림 만들어 반환한다.
langList.stream()
        .filter(x->x.length()<=4)
        .filter(x->x.contains("c"))
        .map(x -> x + "(어려워요)") //람다식은 String f(String x) {return x+"(어려워요)"}랑 같은 말
        .forEach(System.out::println);
System.out.println("-----------------------------------------");

// c라는 글자를 포함하는 언어를 대문자로 출력
langList.stream()
        .filter(x -> x.contains("c"))
        .map(String::toUpperCase)
        .forEach(System.out::println);
System.out.println("-----------------------------------------");


// c 라는 글자를 포함하는 언어를 대문자로 변경하여 리스트로 저장
List<String> langListStratsWithC = langList.stream()
        .filter(x -> x.contains("c"))
        .map(String::toUpperCase)
        .collect(Collectors.toList());

langListStratsWithC.stream().forEach(System.out::println);

**참고** 매소드 참조

// 스트림 연산을 거칠 때, 람다식은 매소드 참조로 더 쉽게 표현 가능.
// 매소드 참조 시, 인수를 받는 부분이 없지만, 
// 전 스트림 연산에서 반환된 값을 자동으로 인수로 받아 처리하므로 걱정없다.
// 매소드 참조의 형태는 다음과 같다. //  클래스이름::매소드이름

//예시1)
.forEach(n -> System.Out.println(n));
.forEach(System.out::println);

//예시2)
.map(n -> String.toUpperCase(n))
.map(String::toUpperCase)

2. 스스로 해보기

package WorkOut_Myself;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class Stream_intensiveCourse {
    public static void main(String[] args) {
        ArrayList<String> name = new ArrayList<>(Arrays.asList("김박사","임용한 교수님","이박사","윤영 시발롬","프로이트","김규한"));

        // C로 시작하는 프로그래밍 언어만 출력, java 라는 글자 포함하는 언어만 출력
        System.out.println("<<C로 시작하는 프로그래밍 언어만 출력>>");
        name.stream().filter(n -> n.startsWith("김")).forEach(System.out::println);
        System.out.println();
        System.out.println("<<java 라는 글자 포함하는 언어만 출력>>");
        name.stream().filter(n -> n.contains("박사")).forEach(System.out::println);
        System.out.println("--------------------------------------------");
        // 4글자 이하 언어 뽑아서 정렬 뒤 출력
        System.out.println("<<4글자 이하 언어 뽑아서 정렬 뒤 출력>>");
        name.stream().filter(n->n.length()>=4).sorted().forEach(System.out::println);
        System.out.println("--------------------------------------------");
        // 4글자 이하 언어 중 C가 들어가는 말 있으면 true 반환 // 전부 C가 들어가면 true 반환
        System.out.println("4글자 이하 언어 중 C가 들어가는 말 있으면 true 반환");
        boolean Yoon =  name.stream().filter(n -> n.length() >= 4).anyMatch(n -> n.contains("윤영"));
        System.out.println(Yoon);
        System.out.println("전부 C가 들어가면 true 반환");
        boolean Yoon2 =  name.stream().filter(n -> n.length() >= 4).allMatch(n -> n.contains("윤영"));
        System.out.println(Yoon2);

        // 문자열 뒤에 다른 말 붙여서 출력
        name.stream().filter(n->n.contains("윤영")).map(n -> n + " (개 싸가지 없는 새끼)").forEach(System.out::println);

        // 전부 대문자로 출력
        ArrayList<String> name2 = new ArrayList<>();
        name2.add("john");
        name2.add("Harry");
        name2.add("son");
        name2.add("Klusepski");
        name2.add("Romero");

        name2.stream().map(String::toUpperCase).forEach(System.out::println);
        // C라는 말 포함한 언어 전부 대문자로 변경해서 새로운 리스트에 저장
        System.out.println("----------------------------");
        List<String> o = name2.stream().filter(n -> n.contains("o")).map(String::toUpperCase).collect(Collectors.toList());
        o.stream().forEach(System.out::println);

    }
}

'Language > Java' 카테고리의 다른 글

오류에 따른 맞춤 예외 처리  (0) 2023.02.23
Run-Time(런타임) 오류와 예외 처리  (0) 2023.02.23
[JAVA] Stream  (0) 2023.02.18
[JAVA] 람다식과 함수형 인터페이스  (0) 2023.02.16
[JAVA] 익명 클래스  (0) 2023.02.15