JavaRush /Java Blog /Random-KO /람다와 스트림, 연습만 있고 이론은 없음

람다와 스트림, 연습만 있고 이론은 없음

Random-KO 그룹에 게시되었습니다
안녕하세요 여러분. 대회를 계기로 여기에 기사가 아닌 짧은 교훈을 쓰기로 결정했습니다. Java의 람다와 스트림에 관한 것입니다. 이미 익숙하고 이를 사용하고 있다면 기사 끝 부분으로 바로 건너뛰어 연습할 수 있는 JavaRush 관련 작업 몇 가지를 선택해 보세요. Java 8 이상이 필요하고 JR의 교육이 필요합니다. 세부 사항은 거의 없고 이해할 수 없는 것들이 많을 것이며 그것을 알아내려는 강한 열망이 있을 것입니다. 람다와 스트림 출현의 역사를 설명하지 않을 것이라는 사실부터 시작하겠습니다. 나 자신도 모릅니다. 나는 그것이 함수형 프로그래밍 스타일에서 OOP 스타일로 발전했다는 것만 알고 있습니다. 짧은 학습 경험에서 나는 어떤 사람들이 아이디어를 이해하기 어렵다고 생각하는 방법과 내용을 간단히 보여 주었으므로 작성 방법만 기억하면 나중에 이해할 수 있습니다.

람다

람다와 스트림, 연습만 있고 이론은 없음 - 1람다와 스트림, 연습만 있고 이론은 없음 - 2람다가 무엇인지 전혀 모른다면: 람다는 다음과 같습니다:
(a, b) -> a.compareTo(b)
(переменные) -> действие
지금은 그것으로 충분합니다. 여기에서 이론을 읽을 수 있습니다. 링크 1 , 링크 2. 하지만 연습이 훨씬 더 재미있다고 생각합니다. 다음 문제를 해결해 보시기 바랍니다. 방법 1을 사용하여 계산기를 작성하세요. 이 메소드는 2개의 디지털 값과 다른 것을 받아들여야 합니다. 코드는 다음과 같습니다.
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
메소드 서명에 3개의 매개변수를 입력하고 calculate, 1개의 명령을 추가하고 return, 에서 이 메소드 호출을 테스트 해야 합니다 main. 이 방법은 무엇을 할 수 있어야 합니까?
  • 겹;
  • 곱하다;
  • 나누다;
  • 덜다;
  • 근을 계산하다;
  • 세력을 키우다;
  • 인수의 합을 첫 번째 숫자 + 117로 나눈 값을 거듭제곱합니다.
  • 그리고 당신이 생각할 수 있는 다른 모든 작업.
사용하지 말아야 할 것:
  • if-else;
  • char작동 표시기로서;
  • switch-case;
  • 그리고 당신의 마음에 떠오르는 다른 모든 것.
당신이 사용할 수 있는 것:
  • 람다만이 작업을 수행합니다.
- 무엇? 그리고 그게 다야? - 예, 그게 전부입니다. 말 그대로 3줄을 추가해야 하기 때문에 제가 최소한 한 줄을 제안하면 나머지는 자동으로 작성됩니다. 그리고 원한다면 구글에 예시를 찾아 이해하려고 노력할 수도 있습니다. 물론 자신을 확인하고 속임수를 쓰면 아무도 알 수 없지만 왜 그럴까요? 이러한 간단한 문제를 해결함으로써 1.5명의 학생 모두가 람다가 무엇인지, 어떻게 사용하는지 대략적인 이해를 얻었습니다. 이는 스트리밍에 매우 필요합니다. 결과를 자랑하고 제대로 했는지 확인하고 싶다면 비공개 메시지로 코드를 보내세요. 댓글을 달 필요는 없습니다. 거기에 흥미로운 팁을 추가할 수 있습니다(그러나 작업을 너무 쉽게 만들지 않는 방식으로). 다시 말하지만, 이 예제를 풀고 나면 이미 람다 사용 방법을 대략적으로 이해하게 될 것입니다.
람다와 스트림, 연습만 있고 이론은 없음 - 3
이제 자바 스트림으로 넘어가겠습니다. 이것은 독자 여러분이 생각했던 스트림이 아닙니다. 아니요, inputStream그렇지도 않습니다 OutputStream. 달라서 더 흥미롭습니다. 스트림은 완전히는 아니지만 여전히 주기를 대체했습니다. 그들은 "어떻게 하는지 설명하지 말고, 무엇을 해야 하는지 설명하라"는 모토로 제공됩니다. 스트림의 작은 예:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
여기서 무슨 일이 일어나고 있는 걸까요? 의견을 추가해 보겠습니다.
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
일반 루프와 비교해 보세요:
List<String> toSort = new ArrayList<>();
for(String s : myList){
     if(s.startsWith("c")){
         toSort.add(s.toUpperCase());
     }
}

Collections.sort(toSort);

for(String s : toSort){
     System.ouy.println(s);
}
코드를 읽어보면 모든 것이 무섭게 보이지만 주석을 사용하면 좀 더 쉬워지나요? 이것은 정상이며 나도 오랫동안 이해하지 못했습니다. 이해의 핵심은 실천입니다. 따라서 우리는 타사 기사를 읽고 질문에 대한 답변을 찾기 시작합니다. 여기 댓글에서 질문할 수도 있습니다. 완전한 답변을 제공하지는 않지만 방향을 지적하겠습니다. 스트리밍 연습에 유용하다고 생각되는 JavaRush의 작업 목록은 다음과 같습니다.
  • 2208 - 1개의 스트림과 1개의 리턴으로 해결될 수 있습니다. 즉, 메소드의 본문은 return1개의 전체 스트림으로 시작됩니다. 요구 사항을 생략합시다 StringBuilder.

  • 1908 - 1개의 스트림과 1개의 리턴으로 해결할 수도 있습니다. 파일을 읽는 것부터 시작합니다. 스트림을 통해 파일에 녹음하는 방법을 모르겠습니다(가능한 경우). 지금은 수동으로 녹음합니다. 저것들. 2개의 스트림(콘솔 및 파일 쓰기)만 엽니다. 시트나 스트림(google 및 javadoc)을 반환하는 메서드를 통해 파일을 읽습니다.

  • 1907 - 이론적으로는 하나의 스트림으로 해결할 수도 있습니다. 스트림에 대한 입력은 파일 이름이고, 출력은 세계의 단어 수입니다.

그게 다야. 가능하다면 또 다른 간단한 이야기를 쓰겠습니다. 제 생각에는 시도해 볼 기회도 없이 멋진 것에 대해 읽는 것은 왠지 지루한 일입니다. 그리고 계산기와 세 가지 퍼즐을 풀고 나면 이미 람다와 스트림에 대해 잘 알고 계시리라 생각합니다. 아직 읽지 않으셨다면 모든 가능성에 대해 읽어보세요. UPD:
  • 1016 - 약간 왜곡된 방식으로 1개의 스트림과 1개의 리턴으로 해결할 수 있습니다.

  • 1821 - 매우 쉽고 1개의 스트림과 1개의 리턴이 가능합니다.

    이 두 가지 작업에서는 또 다른 스트리밍 방법과 또 다른 수집기를 소개합니다.

  • 1925년 - 한 스트림에서 단어가 포함된 행을 가져온 다음 이를 파일에 쓸 수 있습니다(스트림에서 파일에 쓰는 것이 가능한지는 모르겠습니다).

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION