ホームページ Java &#&チュートリアル Java8 での関数型プログラミングの例

Java8 での関数型プログラミングの例

Aug 09, 2017 pm 02:03 PM
java8 プログラミング

関数型プログラミング、この単語は関数とプログラミングという 2 つの名詞で構成されています。プログラミングという言葉を説明する必要はありません。誰もがやっていることです。実際、関数という言葉は切り離して考えると馴染みがありませんが、この 2 つの組み合わせは何でしょうか? 以下の記事では、Java8 関数型プログラミングに関する関連情報を紹介します。

はじめに

前の記事では、ラムダとストリームについて簡単に学びました。この章では、関数型プログラミングの考え方を確認して理解します。 関数型という用語が何度も出てきますが、それはラムダのことを指しているのでしょうか?もしそうなら、関数型プログラミングはあなたにどのような利点をもたらしますか? , たとえば、料理をするときは、通常、慣れ親しんだ調理方法に従って、まず野菜を洗い、次に野菜を切り、油を熱し、食器を置き、そして...これは一連の命令のように見えます。これを命令型プログラミングと呼びます。その特徴は、シリアル化され命令型である工場の組立ラインやコンピューターの命令処理によく似ています。

CookingTask cookingTask = new CookingTask();
cookingTask.wash();
cookingTask.cut();
cookingTask.deepFry();
cookingTask.fried();
...
ログイン後にコピー
宣言プログラミング

ラムダと関数式を使用して上記の問題を解決する場合、次のようになります:

public class CookingDemo {
 public void doTask(String material, Consumer<String> consumer) {
  consumer.accept(material);
 }
 public static void main(String[] args) {
  CookingDemo cookingDemo = new CookingDemo();
  cookingDemo.doTask("蔬菜", material -> System.out.println("清洗" + material));
  cookingDemo.doTask("蔬菜", material -> System.out.println(material + "切片"));
  cookingDemo.doTask("食用油", material -> System.out.println(material + "烧热"));
  cookingDemo.doTask("", material -> System.out.println("炒菜"));
 }
}
ログイン後にコピー

ここでクックします。実装の詳細は関数ライブラリに任せられます。このようにして、クッキング プロセスに他のステップを追加すると、その関数をすぐに理解できるようになります。 doTask メソッドを呼び出して処理する材料を渡すだけで済みます。たとえば、卵を処理するメソッドを記述することなく、食​​用油を加熱する前に卵を溶きたい


cookingDemo.doTask("鸡蛋", material -> System.out.println(material + "打碎搅拌均匀"));
ログイン後にコピー

関数型プログラミングとは

「関数型プログラミングとは何か」という質問に対する最も簡単な答えは、「関数を使用したプログラミングの方法です」です。 理解は人それぞれ異なりますが、核心は次のとおりです。問題を考えるときは、関数は不変の値と関数を使用して、ある値を処理し、それを別の値にマッピングします。


異なる言語コミュニティは、それぞれの言語の特徴に対して排他的な賞賛を抱いていることがよくあります。 Java プログラマが関数型プログラミングをどのように定義しているかについて話すのは時期尚早ですが、それはまったく問題ではありません。私たちは、関数型プログラミングのスタイルに準拠したコードではなく、優れたコードを書くことを重視しています。

文字列型とブール型のパラメータを入力し、整数のパラメータを出力する関数を設計することを想像してみましょう。

int pos = 0;
public Integer foo(String str, boolea flag){
 if(flag && null != str){
  pos++;
 }
 return pos;
}
ログイン後にコピー
この例には入力と出力があり、同時に各呼び出しで外部変数の値も更新される可能性があります。このような関数を副作用付き関数と呼びます。

関数型プログラミングのコンテキストでは、「関数」は数学関数に対応します。0 個以上の引数を受け取り、1 つ以上の結果を生成し、副作用はありません。 以下の関数のように、入力を受け取り、何らかの出力を生成するブラック ボックスと考えることができます

public Integer foo(String str, boolea flag){
 if(flag && null != str){
  return 1;
 }
 return 0;
}
ログイン後にコピー

このタイプの関数と Java プログラミング言語で見られる関数の違いは非常に重要です ( log や sin などの数学関数には副作用があることを想像してください)。 特に、数学関数が同じパラメータで呼び出された場合、返される結果は同じでなければなりません。ここでは、今のところ Random.nextInt のようなメソッドについては考慮しません。


関数の副作用

「関数型」について話すとき、私たちが言いたいのは、実際には「数学関数のような - 副作用がない」ということです。 。このことから、プログラミングにおけるいくつかの微妙な問題が発生します。 すべての関数は関数と if-then-else のような数学的考え方を使用してのみ構築できるということですか? それとも、これらの操作の結果がシステムの他の部分に公開されない限り、関数が非機能的な操作を内部で実行することも許可しますか? 言い換えれば、プログラムに特定の副作用があるが、その副作用が他の呼び出し元には認識されない場合、その副作用は存在しないと仮定できますか? 呼び出し元は、これらの副作用についてはまったく影響を及ぼさないため、知る必要も気にする必要もありません。


この 2 つの違いを定義したい場合、前者を純粋関数型プログラミングと呼び、後者を関数型プログラミングと呼びます。

実際のプログラミングでは、標準ライブラリ関数を含む多くの古いコードには副作用があるため、Java 言語を使用して純粋に関数的な方法でプログラムを完成させることは困難です (Scanner.nextLine の呼び出しには副作用があり、最初から始まります)。 a ファイルから 1 行を読み取ります。通常、2 つの呼び出しの結果は完全に異なります)。システムのほぼ純粋に機能的な実装を作成したいと考えており、コードに副作用がないことを確認する必要があります。このような関数またはメソッドには副作用がないと仮定します。実行のためにメソッド本体に入るとき、フィールドの値は 1 ずつ増加し、メソッド本体を終了する前に、フィールドの値は 1 ずつ減少します。シングルスレッド プログラムの場合、このメソッドには副作用がなく、機能実装とみなすことができます。

関数型スタイルを構築するためのガイドラインは、「関数型スタイル」と呼ばれる関数またはメソッドはローカル変数のみを変更できるということです。また、それが参照するオブジェクトは Final である必要があります。 すべての参照型フィールドは不変オブジェクトを指します。

概要

以上がJava8 での関数型プログラミングの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

正規表現を使用してPHP配列から重複した値を削除します 正規表現を使用してPHP配列から重複した値を削除します Apr 26, 2024 pm 04:33 PM

正規表現を使用して PHP 配列から重複値を削除する方法: 正規表現 /(.*)(.+)/i を使用して、重複値を照合して置換します。配列要素を反復処理し、preg_match を使用して一致をチェックします。一致する場合は値をスキップし、一致しない場合は重複値のない新しい配列に追加します。

プログラミングは何のためにあるのか、それを学ぶと何の役に立つのか? プログラミングは何のためにあるのか、それを学ぶと何の役に立つのか? Apr 28, 2024 pm 01:34 PM

1. プログラミングは、Web サイト、モバイル アプリケーション、ゲーム、データ分析ツールなど、さまざまなソフトウェアやアプリケーションの開発に使用できます。その応用分野は非常に幅広く、科学研究、医療、金融、教育、エンターテイメントなど、ほぼすべての業界をカバーしています。 2. プログラミングを学ぶことは、問題解決スキルと論理的思考スキルを向上させるのに役立ちます。プログラミング中、問題を分析して理解し、解決策を見つけてコードに変換する必要があります。この考え方は、分析能力と抽象能力を養い、実際的な問題を解決する能力を向上させることができます。

Golang を使用してブラウザベースのアプリケーションを構築する Golang を使用してブラウザベースのアプリケーションを構築する Apr 08, 2024 am 09:24 AM

Golang を使用してブラウザベースのアプリケーションを構築する Golang は JavaScript と組み合わせて、動的なフロントエンド エクスペリエンスを構築します。 Golang をインストールする: https://golang.org/doc/install にアクセスします。 Golang プロジェクトをセットアップします。 main.go というファイルを作成します。 GorillaWebToolkit の使用: HTTP リクエストを処理するための GorillaWebToolkit コードを追加します。 HTML テンプレートの作成: template サブディレクトリに、メイン テンプレートであるindex.html を作成します。

コーディングの鍵: 初心者のための Python の力を解き放つ コーディングの鍵: 初心者のための Python の力を解き放つ Oct 11, 2024 pm 12:17 PM

Python は、学習の容易さと強力な機能により、初心者にとって理想的なプログラミング入門言語です。その基本は次のとおりです。 変数: データ (数値、文字列、リストなど) を保存するために使用されます。データ型: 変数内のデータの型 (整数、浮動小数点など) を定義します。演算子: 数学的な演算と比較に使用されます。制御フロー: コード実行のフロー (条件文、ループ) を制御します。

Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Oct 11, 2024 pm 08:58 PM

Python は、問題解決の初心者に力を与えます。ユーザーフレンドリーな構文、広範なライブラリ、変数、条件文、ループによる効率的なコード開発などの機能を備えています。データの管理からプログラム フローの制御、反復的なタスクの実行まで、Python が提供します

C++ プログラミング パズルのコレクション: 思考を刺激し、プログラミング スキルを向上させます C++ プログラミング パズルのコレクション: 思考を刺激し、プログラミング スキルを向上させます Jun 01, 2024 pm 10:26 PM

C++ プログラミング パズルは、フィボナッチ数列、階乗、ハミング距離、配列の最大値と最小値などのアルゴリズムとデータ構造の概念をカバーします。これらのパズルを解くことで、C++ の知識を強化し、アルゴリズムの理解とプログラミング スキルを向上させることができます。

C の謎を解く: 新人プログラマーのための明確でシンプルな道 C の謎を解く: 新人プログラマーのための明確でシンプルな道 Oct 11, 2024 pm 10:47 PM

C は、初心者がシステム プログラミングを学習するのに最適な選択肢です。ヘッダー ファイル、関数、メイン関数のコンポーネントが含まれています。 「HelloWorld」を印刷できる単純な C プログラムには、標準入出力関数宣言を含むヘッダー ファイルが必要で、main 関数で printf 関数を使用して印刷します。 C プログラムは、GCC コンパイラーを使用してコンパイルして実行できます。基本をマスターしたら、データ型、関数、配列、ファイル処理などのトピックに進み、熟練した C プログラマーになることができます。

Go Get を使用して Go モジュールをすばやく簡単に入手します Go Get を使用して Go モジュールをすばやく簡単に入手します Apr 07, 2024 pm 09:48 PM

GoGet を使用すると、Go モジュールをすばやく簡単に取得できます。手順は次のとおりです: ターミナルで goget[module-path] を実行します。ここで、 module-path はモジュール パスです。 GoGet は、モジュールとその依存関係を自動的にダウンロードします。インストールの場所は、GOPATH 環境変数によって指定されます。

See all articles