質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

930閲覧

HashMapの中でラムダ式を表現したい

NASKA--

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/05/27 03:59

編集2021/05/27 14:33

四則演算の処理において、演算子の文字列をキーとし、四則演算処理を行う関数を値としたHashMapを利用したプログラムとして作成したい。
四則演算の方法としては「逆ポーランド記法の四則演算」のようなプログラムにしたい。

プログラムは作りましたが、エラーが出てしまいます

java

1package prog2; 2import java.util.*; 3import java.util.function.*; 4public class CalculatorFunc { 5 HashMap<String,DoubleUnaryOperator> optable = new HashMap<> (); 6 void run() { 7 optable.put("+",(x,y) -> {return x+y;}); 8 optable.put("-",(x,y) -> {return x-y;}); 9 optable.put("*",(x,y) -> {return x*y;}); 10 optable.put("/",(x,y) -> {return x/y;}); 11 Scanner sc = new Scanner(System.in); 12 while(true) { 13 String [] input = sc.nextLine().split("[ ]+"); 14 if(input[0].equals("quit")) break; 15 List<String> exp = Arrays.asList(input); 16 double ans = calcFromPostExp(exp); 17 System.out.println(ans); 18 } 19 sc.close(); 20 } 21 double calcFromPostExp(List <String> postExp) { 22 LinkedList<Double> stack = new LinkedList<Double>(); 23 for(String st: postExp) { 24 System.out.println(stack); // デバッグ用 25 System.out.println(st); // デバッグ用 26 if(optable.containsKey(st)) { 27 // 演算の処理 28 double v2 =stack.pollFirst(); 29 double v1 =stack.pollFirst(); 30 double value = optable.get(st).applyAsDouble(value); 31 // スタックにプッシュする処理を下に書く 32 stack.push(value); 33 } else { 34 // それ以外は数字だと思う 35 double value = Double.parseDouble(st); 36 // スタックにプッシュする処理を下に書く 37 stack.push(value); 38 } 39 } 40 double ans =stack.pop(); 41 return ans; 42 } 43 public static void main(String[] args) { 44 new CalculatorFunc().run(); 45 } 46}

このような形で作ったのですが、以下の部分だけエラーが出てきます。どのように修正すれば良いでしょうか

java

1optable.put("+",(x,y) -> {return x+y;}); 2 optable.put("-",(x,y) -> {return x-y;}); 3 optable.put("*",(x,y) -> {return x*y;}); 4 optable.put("/",(x,y) -> {return x/y;});

エラーメッセージ

- Lambda expression's signature does not match the signature of the functional interface method applyAsDouble(double) - 型 HashMap<String,DoubleUnaryOperator> のメソッド put(String, DoubleUnaryOperator) は引数 (String, (<no type> x, <no type> y) -> {}) に適用できませ ん - 構文エラーがあります。";" を挿入して BlockStatements を完了してください - 構文エラーがあります。"AssignmentOperator Expression" を挿入して Assignment を完了してください

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hope_mucci

2021/05/27 05:38

これは学校の課題でしょうか? ??の箇所を埋めてください、という質問となると「やってほしいことだけを記載した丸投げの質問」です。 ご自身で調査した結果、実際にプログラムを実行してみた結果が想定と異なる、という段階まで進めてから質問しましょう。 学校の課題であれば実装のヒントは授業中に出ているはずです。復習しましょう。
hope_mucci

2021/05/27 06:50

質問文を修正されましたが、そのコードでは山ほどコンパイルエラーが出てくると思います。 質問文に記載のエラーだけではないはずです。 (そのエラーメッセージは、コンパイルエラーがあるから実行できません、というエラーメッセージです) 記載するならコンパイル時のエラーを全文記載してください。 質問文のように、「とりあえず全部書いてみて(一度もテスト動作させずに)後から動かしてみよう」的なやり方だと、大量のコンパイルエラーに悩まされます。 やりたいことを1行書いて、1行ことにコンパイルして動作を確認する、という少しずつ実装をして細かくテスト実行してみることが重要です。 大抵のコンパイルエラーは、「何かがたりない」的なメッセージが出てくるのでエラーメッセージを読めばある程度理解が可能なはずです。
guest

回答1

0

ベストアンサー

DoubleUnaryOperator は double型の引数を1つとり、double型を返す関数インターフェースです。
質問文の課題は、double型の引数が2つ必要なので DoubleUnaryOperator ではラムダ式と引数が合わず使用できません。
DoubleBinaryOperator を使用してください。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/function/DoubleBinaryOperator.html
(自作しても良いです)

関数インターフェースは複雑で面倒です。ラムダ式も他の言語の様に気軽に使えないので大変ですがしっかり勉強してください。

参考:ひしだま様の解説
http://www.ne.jp/asahi/hishidama/home/tech/java/functionalinterface.html

投稿2021/05/27 14:49

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NASKA--

2021/05/27 15:08

こんな時間に回答ありがとうございます 今回いただいたご指摘をこれからも活かしたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問