[TIL]1月18日
かんすうしきプログラミング
以下のブログの内容を整理する
関数式プログラミングの基礎(1)なぜ関数式プログラミングなのか
[JAVA 8]-関数式プログラミング
オブジェクト向けプログラミングと関数式プログラミングの違い
管理
コードを簡潔に記述し、オブジェクトとは異なる方法でアクセスできます.
関数式プログラミングはいくつかのデータ構造(list,set,map)を利用して動作を最適化する
上のブログでサンプルコードを見ましたが、理解できません.StreamとRamdaを学ぶべきだと思います.
浮動小数点効果を除去し、純粋な関数を作成し、モジュール化の程度を向上させるプログラミングモード.
1.対象は命令式プログラミング、関数式プログラミングは宣言式プログラミングである。
List<String> myList = Arrays.asList("c1", "a2", "b3", "4", "5");
// 기존 방식
for(int i = 0; i < myList.size(); i++){
String s = myList.get(i);
if(s.startsWith("c")){
System.out.println(s.toUpperCase());
}
}
// stream API를 이용한 방식
myList.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.forEach(System.out::println);
24172 stram APIを使用する方法から見ると、簡単に関数を宣言することで、データは私の望む方向に処理されています.2.関数プログラミングでは、関数は1レベルのオブジェクトでなければなりません。
一級オブジェクトは、以下の条件を満たすオブジェクトです.
関数式プログラミングはコードの簡潔性を高めた.
関数インタフェース(797 p)
関数型インタフェースには抽象的な方法しかありません.
ラムダ式は匿名の対象であるため,ラムダ式を扱うためには参照変数が必要である.
この参照変数のタイプは、関数型インタフェースです.
しかし,関数インタフェースの方法とram多項式のパラメータ個数と戻りタイプは一致しなければならない.
次の2つのコードをよく比較してみましょう.
interface MyFunction {
int max (int a, int b);
}
public class Exam {
// MyFunction 인터페이스를 구현한 익명 객체 생성
MyFunction f = new MyFunction() {
public int max(int a, int b) {
return a > b ? a : b;
}
};
int value = f.max(5, 3); // 익명 객체의 메서드를 호출
}
上のコードはMyFunctionインタフェースを定義し,そのインタフェースを実現する匿名クラスのオブジェクトを生成する.
上記のコードはramdaフォーマットを使用して以下のように変更できます.
@FunctionalInterface
interface MyFunction {
int max (int a, int b);
}
public class Exam {
MyFunction f = (a, b) -> a > b ? a : b;
int value = f.max(3, 5);
}
コードが簡潔になりました.
ランダ式は匿名の対象です.
@FuncialInterfaceノイズを追加すると、コンパイラは関数インタフェースの条件を満たしているかどうかを確認します.
MyFunctionタイプの参照変数fは、ラムダ式を扱うための参照変数である.
関数インタフェースタイプのパラメータと戻りタイプ(798 p)
@FunctionalInterface
interface MyFunction {
void run();
}
class LamdaEx1 {
// 매개변수 타입이 MyFunction(함수형 인터페이스)인 메서드
static void execute(MyFunction f) {
f.run();
}
// 반환타입이 MyFunction(함수형 인터페이스)인 메서드
static MyFunction getMyFunction() {
return () -> System.out.println("f2.run()");
}
public static void main(String[] args) {
// 람다식으로 MyFunction의 run() 구현
MyFunction f1 = () -> System.out.println("f1.run()");
MyFunction f2 = getMyFunction();
f1.run();
f2.run();
System.out.println();
execute(f1);
execute(() -> System.out.println("run"));
}
}
</> 실행 결과
f1.run()
f2.run()
f1.run()
run
static void execute(MyFunction f) {
f.run();
}
コール
static MyFunction getMyFunction() {
return () -> System.out.println("f2.run()");
}
MyFunction f1 = () -> System.out.println("f1.run()");
execute(() -> System.out.println("run"));
java.util.関数パッケージ(802 p)
java.util.関数パッケージの一般的なフォーマットを関数インタフェースとして定義する方法
条件式のPredicat
Predicate<String> isEmptyStr = s -> s.length() == 0;
String s = "";
if(isEmptyStr.test(s)){
System.out.println("This is an empty String.");
}
2つのパラメータを持つ関数インタフェース
2つのパラメータ
UnaryOperatorとBinaryOperator
ストリームAPI
以下のブログレポートまとめ学習
とてもよく整理されています
ジャワ
関数を配列または集合インスタンスのデータストリームに組み合わせることで、必要な結果をフィルタし、加工結果を簡単に処理できます.
従来の出力
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class StreamExam {
public static void main(String[] args) {
String[] strArr = {"data1", "data2", "data3"};
List<String> strList = Arrays.asList(strArr);
// 기존 방식, for문을 이용해 결과 출력
Arrays.sort(strArr);
Collections.sort(strList);
for(String str : strArr){
System.out.println(str);
}
for(String str : strList) {
System.out.println(str);
}
}
}
StreamAPIの使用
// Stream API 사용
strList.stream().sorted().forEach(System.out::println);
Arrays.stream(strArr).sorted().forEach(System.out::println);
// 람다식으로 표현
strList.stream().sorted().forEach(x -> System.out.println(x));
Arrays.stream(strArr).sorted().forEach(x -> System.out.println(x));
データ・ソース(配列またはリスト)からストリームを作成します.
ソート()メソッドを呼び出してソートします.
出力のためにforEach()メソッドを呼び出す
今日やったこと
学習
Reference
この問題について([TIL]1月18日), 我々は、より多くの情報をここで見つけました https://velog.io/@yeon/TIL-1월-18일テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol