Java 공부/자바 공부 (baek)

2021-09-28 람다식~

Hesitater 2021. 9. 28. 10:44
728x90

2021-09-28

람다식중 파라미터이야기

Ex06ZeroParameter

파라미터가 없으면 ()를 생략하지 않고 써야합니다.

Ex07OneParameter
추상 메소드의 파라미터가 하나 있는 경우
람다식에도 써야함
파라미터가 인터페이스의 메서드 타입이랑 일치하는 경우 타입 생략으로 (int a) 를 (a) 로가능
파라미터가 하나인 경우 ()도 생략 가능

결과값

quizEx04

결과값

Ex08ForEach

항상된 for 문 이랑 forEach로 list 출력하기

자기자신의 각 아이템을 파라미터로 받은 액션이라는 객체에 억셉트라는 메소드로
각 파라미터를 넣음
Consumer 가 추상메소드가 한개다 ( 추상메소드 한개는 람다식 가능?!)

결과값에서

반복문으로 한거랑 forEach로 한거랑 똑같이 나옴

메소드 파라미터 메소드 몸통
저 메소드에 (3,4,5,6)을 한번씩 넣는다.

quizEx05

위에꺼 완성해보기

결과값

추상메소드에서 파라미터가 2개이상이라면?

class Ex09TwoParameter

Ex10MapForEach

interface map의 forEach, Interface Biconsumer<T, U>

보통 Biconsumer<map의 key값, map의 value값>

Biconsumer의 추상메서드 단 한개 accept

for (Map.Entry<K, V> entry : map.entrySet())

  action.accept(entry.getKey(), entry.getValue());

결과값

quizEx06

결과값(map이라 순서를 보장 받지 못함)

forEach문을 쓸때 문자 맞추기

ex) ( (k , v) -> System.out.println("key:" + k + ", value:" + v));

collection 중에
추상메소드가 하나있는 것들을 활용해서 람다식 써보기.

교재 689쪽 (705)

참고~

quizEx07

    forEach 파라미터 : Consumer 인터페이스 void accept (T t) 구현   
        컬렉션을 순회하면서 각 요소들에게 취할 행동을 코드로 만든다.  

    removeIf 파라미터 : Predicate 인터페이스 boolean test(T t) 구현    
        컬렉션을 순회하면서 요소에게 적용할 조건식을 코드로 만든다.

문제풀이 + 하나씩 줄여 가기

결과값

quizEx08

//[apple,abc,amond] a로 시작하는 단어만 남도록

결과값(이렇게 나오게)

풀이

  //배열을 남겨두고 작업을 하고 싶으면
  //List<Integer> newList = new ArrayList<>(oldList); 이용 하면되요
  //removeIf (~~~) 를 사용하기전에


  List<String> list = new ArrayList<>(Arrays.asList("apple", "java", "abc", "amond","spring"));

        List<String> newList = new ArrayList<>(list);

        System.out.println("복사한list" + newList);

        // List removeIf 활용
        System.out.println(list);

        //선생님 풀이
        list.removeIf(e -> !e.startsWith("a"));

        //익명 클래스 객체 전부 다쓴것
        list.removeIf(new Predicate<String>() {
            @Override
            public boolean test(String t) {
                return t.charAt(0) != 'a';
            }
        });

        // lambda
        list.removeIf((String t) -> {
            return t.charAt(0) != 'a';
        });

        // lambda : 하나의 명령문 {}중괄호 생략, return 생략
        list.removeIf( (String t) -> t.charAt(0) != 'a') ;


        // lambda : 파라미터 type 생략
        list.removeIf( (t) -> t.charAt(0) != 'a');

        // lambda : 파라미터 () 소괄호 생략
        list.removeIf(t -> t.charAt(0) != 'a');


        System.out.println(list);   //[apple,abc,amond] a로 시작하는 단어만 남도록
        System.out.println("복사한list" + newList);

      }
  }    

결과값이 남게됨

 

 

 

quizEx09

Arraylist에 replaceAll 메소드

interface UnaryOperator <T>

 

결과값

 

풀이들(배열복사는 그냥)

 

 

quizEx10

 

내가 람다식을 못쓰겠어서 그냥 풀로 쓴것

나중에 내가 풀로 쓴것 고쳐 쓰기(선생님과 순서가 반대 + 학생의 정규식..)

 

 

결과값(결과값이 나오긴 함)

 

 

선생님이해주신거

결과값

 

sort 메소드 

sort(Comparator<? super E> c)

 

 

 

---

interface comparable

 

compareTo 메서드를 하나 가지고 있다

 

사전 순서라고 생각하면됩니다.

 

 

 

●int compareTo(NumberSubClass referenceName)
●int compareTo(String anotherString)
●compareTo() 함수는 두개의 값을 비교하여 int 값으로 반환해주는 함수이다.

compareTo() 함수에는 위에서 설명하는바와 같이 "문자열의 비교" 와 "숫자의 비교" 두 방식이 존재
숫자의 비교 같은 경우는 단순히 크다(1), 같다(0), 작다(-1) 의 관한 결과값을 리턴해주고
문자열의 비교 같은 경우는 같다(0), 그 외 양수/음수값 같이 참 재미난 결과를 반환해준다.

-Comparable
Comparable 인터페이스에는 compareTo(T o) 추상메소드 하나가 선언되어있는 것을 볼 수 있다. 이 말은 우리가 만약 Comparable을 사용하고자 한다면
 compareTo 메소드를 재정의(Override/구현)을 해주어야 한다는 것이다.
-Comparator
Comparator를 보면 선언 된 메소드가 많아서 보기 힘들지만 
실질적으로 구현해야 하는 것은 단 추상메서드 하나다.

 

여기서 중요한건 객체를 비교할 수 있도록 만든다 라고합니다

Comparable은 "자기 자신과 매개변수 객체를 비교"하는 것이고, Comparator는 "두 매개변수 객체를 비교"한다는 것이다.

 

 

Ex11Comparator

 

 

결과값

 

Ex11Comparator 그냥 내가 따로연습

 

결과값

 

 

----------------------------------

Ex11

 

결과값

 

 

 

quizEx11

 

 

결과값

 

 

public class Ex12 

 

 

 

결과값

 

 

 

public class Ex12Map

 

현재 key4가 없엇 v에 null 이들어가는데 comapre에서 value값이 null이면 출력을 안시킴

map.compute(4, (k, v) -> v == null? k*10 : v *10);

 앞써 key4의 value 값이 null 인상태라서  v == null 이 true라서 k*10이 나온다 고로 4*10 이나옴

 

 

결과값

 

 

풀어서 + 알파

 

결과값

 

선생님이 push 해준거

결과값

 

 

Ex13MapCompute

//collection map quiz Ex09 참조

오른쪽에 for ~ if ~else 의 긴 문장이 왼쪽에서 for~ 람다식~ 끝~ ㅎㅎ...

 

 


Ex13MapComputeTest

 

 


Local variable sum defined in an enclosing scope must be final or effectively final

 

람다식 쓸때 유의점

Ex14FinalVariable

Local variable sum defined in an enclosing scope must be final or effectively final

람다식 쓸때 지역 변수는 사용이 가능한데 변경을 할 수 가 없어용.

Local variable sum defined in an enclosing scope must be final or effectively final

(sum이라는지역변수가 안에서 final 이거나 암묵적으로 final이라고 취급됨)

먼말인지 모르면 그냥 지역변수를 변경할 수 없다...라고 알아두자

변수를 선언해서 쓰려면

필드로 선언해서 쓰던가 스태틱필드로 선언해서 쓰던가

값을 바꾸지 않아도 되는 참조 변수를 쓰던가.

 

 

 

quizEx13

 

 

 

결과값( 1,1,1,1나온건 무시 아래 가 답)

선생님 답변

 

 

 

'Java 공부 > 자바 공부 (baek)' 카테고리의 다른 글

2021-09-30  (0) 2021.09.30
2021-09-29 chapter 18 IO 기반 입출력 및 네트워킹~  (0) 2021.09.29
2021-09-27 오후 14. 람다식  (0) 2021.09.27
2021-09-27 13.4,5,6 제네릭 + 와일드카드  (0) 2021.09.27
2021-09-24  (0) 2021.09.24