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

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

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

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

Q&A

解決済

2回答

844閲覧

MapでStream APIを利用したい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2020/06/03 08:33

前提・実現したいこと

Mapのvalueの値が50未満のgradeのみ.filterで取り出しその後.forEachを用いて取り出されたgradeのkeyとvalueを表示したい

発生している問題・エラーメッセージ

Exception

1 at mainStream.lambda$0(mainStream.java:15) 2 at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174) 3 at java.util.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1699) 4 at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) 5 at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) 6 at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) 7 at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) 8 at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 9 at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) 10 at mainStream.main(mainStream.java:15) 11 12エラーメッセージ

該当のソースコード

JAVA

1ソースコード 2```import java.util.HashMap; 3import java.util.Map; 4 5public class mainStream { 6 7 public static void main(String[] args) { 8 Map<String,Integer>grade=new HashMap<>(); 9 10 grade.put("Tom", 100); 11 grade.put("Bob", 50); 12 grade.put("John", 20); 13 14 grade.entrySet().stream() 15 .filter(e->grade.get(e)<50).forEach(System.out::println); 16 } 17 18} 19 20### 試したこと 21eclipsの解決策に従って進めた。 22 23### 補足情報(FW/ツールのバージョンなど) 24 25Mapという機能はkeyとvalueを別で考えることはできないのでしょうか。 26今回、Stream APIという機能を使ってみたくこのようなプログラムを作成しようと考えたのですが、if文を利用した場合も一時的にvalueの値のみでgradeを比較するということはできないのでしょうか。

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

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

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

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

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

guest

回答2

0

Map#entrySet()で得られるSetに入っているのは、Map.Entryという、KeyとValueの組のオブジェクトです。getKeyでKeyが、getValueでValueが得られます。
よって、次のようにすれば実現可能です。

java

1import java.util.HashMap; 2import java.util.Map; 3 4public class mainStream { 5 6 public static void main(String[] args) { 7 Map<String,Integer>grade=new HashMap<>(); 8 9 grade.put("Tom", 100); 10 grade.put("Bob", 50); 11 grade.put("John", 20); 12 13 grade.entrySet().stream() 14 .filter(e->e.getValue()<50).forEach(System.out::println); 15 } 16 17}

投稿2020/06/03 08:41

編集2020/06/03 08:42
swordone

総合スコア20651

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

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

退会済みユーザー

退会済みユーザー

2020/06/03 09:32

回答ありがとうございます! エラーを解消し、じっこうすることができました! Map#entrySet()の仕組みをよく理解しないまま使っていました。
guest

0

ベストアンサー

filterメソッド中のeの型はMap.Entryであって、Stringではありません。
次のようにフィルタリングすれば良いでしょう。

Java

1.filter(e -> e.getValue() < 50)

Mapという機能はkeyとvalueを別で考えることはできないのでしょうか。

できます。MapのAPI仕様を確認して下さい。


追記
あんまり関係ないけれど、『filterメソッド中のe』は誤解を招く表現かも。
『filterメソッドの実引数のラムダ式の仮引数のe』が長ったらしいけど適切?

投稿2020/06/03 08:40

編集2020/06/03 09:04
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2020/06/03 09:01

回答ありがとうございます。 エラーを消すことができました。 また、同様の方法を用いてKeyのみを表示することもできました。 ありがとうございました。MapのAPI使用を確認してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問