Java 함수식 프로그래밍(8): 문자열 및 메소드 참조

제3장 문자열, 비교기 및 필터
JDK가 도입한 몇 가지 방법은 함수식 스타일의 코드를 작성하는 데 도움이 된다.JDK 라이브러리의 일부 종류와 인터페이스를 우리는 이미 매우 익숙하게 사용했다. 예를 들어 String은 예전의 습관적인 낡은 스타일에서 벗어나기 위해 이런 새로운 방법을 사용할 기회를 자발적으로 찾아야 한다.마찬가지로, 우리가 단지 하나의 방법만 있는 익명 내부 클래스를 사용해야 할 때, 우리는 이제 람다 표현식으로 그것을 대체할 수 있으며, 다시는 원래처럼 그렇게 번거롭게 쓸 필요가 없다.
이 장에서 우리는 lambda 표현식과 방법 인용을 사용하여 문자열을 훑어보고Comparator 인터페이스를 실현하며 디렉터리의 파일을 보고 파일과 디렉터리의 변경을 감시합니다.지난 장에서 소개한 몇 가지 방법은 우리가 이 임무를 더욱 잘 완성할 수 있도록 계속 여기에 나타날 것이다.네가 배운 이 신기술들은 지루하고 번거로운 코드를 간결하게 만드는 데 도움이 될 뿐만 아니라 신속하게 실현할 수 있을 뿐만 아니라 유지 보수도 쉽다.
반복 문자열
chars() 방법은 String 클래스의 새로운 방법입니다. 이것은 CharSequence 인터페이스의 일부입니다.String의 문자 시퀀스를 빠르게 훑어보려면 유용한 도구입니다.이 내부 교체기가 있으면 우리는 문자열의 각 문자를 편리하게 조작할 수 있다.우선 그것으로 문자열을 처리해 보세요.여기에서 인용 방법의 몇 가지 사용 방식을 소개한다.

final String str = "w00t";
str.chars()
     .forEach(ch -> System.out.println(ch));
chars () 방법은 Stream 대상을 되돌려줍니다. 내부 교체기 forEach () 로 훑어볼 수 있습니다.교체기에서, 우리는 문자열의 문자에 직접 접근할 수 있다.다음은 문자열을 훑어보고 각 문자의 출력 결과입니다.

119
48
48
116
이것은 결코 우리가 원하는 결과가 아니다.우리가 바라는 것은 자모이지만, 출력하는 것은 숫자다.이것은 chars() 방법이 문자형이 아닌 정형 Stream으로 되돌아오기 때문입니다.우리는 먼저 이 API를 이해한 다음에 출력의 결과를 최적화한다.
앞의 코드에서 우리는 forEach 방법의 삽입으로 lambda 표현식을 만들었다.그것은 단지 간단하게 매개 변수를 println () 방법에 전달했을 뿐이다.이 조작은 매우 흔하기 때문에, 우리는 자바 컴파일러를 빌려 이 코드를 간소화할 수 있다.25페이지의 사용 방법 인용에서처럼 하나의 방법으로 인용하여 그것을 대체하고, 컴파일러가 우리에게 매개 변수 루트를 만들어 주도록 한다.
우리는 어떻게 실례적인 방법을 만드는 방법을 인용하는지 이미 보았다.예를 들면,name.toUpperCase() 메서드, 메서드 참조는 String::toUpperCase입니다.다음 예에서 우리가 호출하는 것은 정적 인용 시스템이다.out의 실례적인 방법방법이 인용한 두 개의 사칭 왼쪽은 하나의 클래스 이름이나 표현식일 수 있다.이 유연성이 있으면 println () 방법의 인용을 쉽게 만들 수 있습니다. 아래와 같습니다.

str.chars()
     .forEach(System.out::println);
Java 컴파일러는 인자를 똑똑하게 완성할 수 있는 루트를 볼 수 있다.다음 lambda 표현식과 방법 인용은 함수식 인터페이스를 수신하는 곳에만 나타날 수 있고 자바 컴파일러는 그곳에서 대응하는 방법을 생성할 수 있다.이전에 우리가 사용한 방법은String::toUpper Case를 인용하여 그 생성 방법의 매개 변수를 전달하면 마지막에 이 방법이 호출하는 목표 대상이 됩니다. 이렇게:parameter.toUpperCase().이 메서드는 클래스 이름(String)을 기반으로 참조하기 때문입니다.위의 이 예에서 인용한 방법은 하나의 표현식에 기초한 것이다. 이것은 Print Stream의 실례로 시스템을 통해 이루어진다.out에서 인용합니다.방법이 호출된 대상이 이미 있기 때문에 자바 컴파일러는 생성 방법의 매개 변수를 이 println 방법의 매개 변수로 사용하기로 결정합니다: 시스템.out.println(name).
(역주: 사실은 주로 두 가지 장면이다. 마찬가지로 하나의 방법 인용을 전달했다. 하나는 두루 돌아다니는 대상이다. 물론 방법이 호출하는 목표 대상, 예를 들어name.toUpper Case, 다른 하나는 방법으로 호출하는 매개 변수, 예를 들어 System.out.println(name)이다.
방법으로 인용한 후에 코드가 훨씬 간결해졌지만, 우리는 그것이 어떻게 작동하는지 깊이 이해해야 한다.일단 우리가 방법 인용에 익숙해지면, 매개 변수의 루트를 스스로 이해할 수 있을 것이다.
비록 이 예중의 코드는 이미 충분히 간결하지만, 출력은 여전히 마음에 들지 않는다.우리가 보고 싶은 것은 자모인데 결과적으로 숫자가 나왔다.이 문제를 해결하기 위해서, 우리는 int를 알파벳으로 출력하는 방법을 써 봅시다.

private static void printChar(int aChar) {
      System.out.println((char)(aChar));
}
사용 방법 인용은 출력 결과의 최적화를 편리하게 완성할 수 있다.

str.chars()
     .forEach(IterateString::printChar);
현재chars()가 되돌아오는 결과는 int이지만 상관없습니다. 인쇄가 필요할 때 문자로 변환합니다.이번 출력은 마침내 알파벳이다.

w
0
0
t
만약 우리가 처음부터 int가 아니라 문자를 처리하기를 원한다면, chars를 호출한 후에 int를 문자로 직접 바꿀 수 있습니다.

str.chars()
     .mapToObj(ch -> Character.valueOf((char)ch))
     .forEach(System.out::println);
여기에서 우리는chars()가 되돌아오는 Stream의 내부 교체기를 사용했는데, 당연히 사용할 수 있는 것은 이 방법뿐만이 아니다.Stream 대상을 받으면 맵 (), filter (), Reduce () 등 모든 방법을 사용할 수 있습니다.우리는 filter () 방법을 사용하여 숫자의 문자를 필터할 수 있습니다.

str.chars()
     .filter(ch -> Character.isDigit(ch))
     .forEach(ch -> printChar(ch));
이렇게 출력할 때 우리는 숫자만 볼 수 있다.

0
0
마찬가지로, lambda 표현식을 filter () 와forEach () 방법에 전달하는 것 외에 우리는 방법을 사용하여 인용할 수 있다.

str.chars()
     .filter(Character::isDigit)
     .forEach(IterateString::printChar);
이곳의 방법은 인용하여 여분의 매개 변수 루트를 생략했다.이 예에서 우리는 앞의 두 방법의 인용과 다른 용법을 보았다.처음에 우리가 인용한 것은 실례적인 방법이고, 두 번째는 정적 인용 (System.out) 의 방법이다.이번에는 정태적인 방법의 인용이다. 방법의 인용은 묵묵히 노력해 왔다.
실례 방법과 정적 방법의 인용은 보기에 모두 같다. 예를 들어 String:::toUpper Case와 Character::isDigit이다.컴파일러는 방법이 실례적인 방법인지 정태적인 방법인지 판단하여 어떻게 매개 변수를 라우팅하는지 결정한다.예를 들어 파라미터, toUpper Case () 등 생성 방법의 삽입을 방법 호출의 목표 대상으로 사용합니다.(물론 예외도 있다. 예를 들어 방법이 호출한 목표 대상이 이미 지정되었다. 예를 들어 System::out.println () 등이다.또한 정적 방법이라면 생성 방법의 인자는 이 인용 방법의 매개 변수, 예를 들어 Character로 사용된다.isDigit(parameter).152페이지의 부록 2, 상세한 방법 인용의 사용 방법과 문법 설명이 있습니다.
비록 방법 인용이 매우 편리하지만, 또 하나의 문제는 방법 명명 충돌로 인한 이의성이다.만약 일치하는 방법이 실례적인 방법도 있고 정적 방법도 있다면, 방법에 잘못된 뜻을 가진 컴파일러가 존재하기 때문에 오류를 보고할 수 있다.예를 들어 이렇게 쓴다. Double::toString, 우리는 사실 더블 형식을 문자열로 바꾸려고 하지만 컴파일러는 도대체 public String toString () 을 호출하는 실례적인 방법이 좋은지, 아니면 public static String toString (double) 방법을 호출하는 것이 좋은지 모른다. 왜냐하면 두 가지 방법이 모두 더블류이기 때문이다.만약 네가 이런 상황에 부딪히면 낙심하지 말고,lambda 표현식으로 완성하면 된다.
일단 우리가 함수식 프로그래밍에 적응하면, 우리는 lambda 표현식과 방법 인용 사이를 마음대로 왔다 갔다 전환할 수 있다.
이 절에서 우리는 자바 8의 새로운 방법으로 문자열을 훑어보았다.Comparator 인터페이스가 어떻게 개선되었는지 살펴보겠습니다.

좋은 웹페이지 즐겨찾기