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

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

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

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

Q&A

解決済

3回答

4716閲覧

【至急】ラムダ式、StreamAPIについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

1クリップ

投稿2016/06/25 15:22

編集2016/06/26 00:47

###前提・実現したいこと
ラムダ式、StreamAPIを用いて以下の機能を実装したいと考えております。
・引数のリストから最大値の取得
・引数のリストから特定の文字を表示させる
・引数のリストから偶数のみを格納したリストを返す
・引数のリストから重複している要素を
排除したハッシュセットを返す
・引数の年月日から半年前の年月日を返す

###発生している問題
・引数のリストから最大値を取得させるところの
Optional<Integer> max = intLits.max(Comparator.naturalOrder());
のintLits.maxのmaxのところで
The method max(Comparator.naturalOrder()) is undefined for the type List<Integer>
というエラーが出てしまい対処法が不明

・特定の文字を抽出させる方法が不明
・偶数のみを格納したリストを
結果用のリストに格納させたいが
(i -> resultList.add(i));のところで
Multiple markers at this line

  • Syntax error, insert "AssignmentOperator Expression" to complete
Expression
  • Syntax error, insert ")" to complete Expression

というエラーが出てしまい対処に困っている

・引数の月から半年前の日付を表示させる方法(関数)が不明

追加事項:
forEachとstrListにおいて

  • Void methods cannot return a value
  • The method forEach(Consumer<? super String>) in the type Stream<String> is not

applicable for the arguments ((<no type> str) -> {})
というエラーが発生してしまいました。

// 引数の年月日から6ヵ月前の年月日を返すところで
LocalDateクラスのminusMonthsメソッドを使用してみたのですが
tring resultDate = LocalDate.parse(strDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"))のところで
以下のエラーが発生してしまいました。
Type mismatch: cannot convert from LocalDate to String

どちらもエラーの対処法と
コードの訂正法を教えていただきたいです。
なるべく早く実装させたいので宜しくお願いします。
###該当のソースコード

public class Answer {
// 引数のリストから最大値を取得する
private Integer task1(List<Integer> intLits) {
//optionalクラス値を持てるクラス(nullCheckを省略(?))
//comparator=関数型のインターフェース(ここでは最大値取得を定義(?))
Optional<Integer> max = intLits.max(Comparator.naturalOrder());
return max.get();
}
// 引数のリストから重複している要素を除外したリストを返す
private List<String> task4(List<String> strList) {
List<String> resultList = new ArrayList<>();
strList.stream().distinct() // 要素をequalsで比較し、重複した要素を除く
.forEach(str -> strList); // 結果用リストに格納
// 引数のリストから「晴れ」のみを表示する
private void task2(List<String> strList) {
strList.stream().filter(str -> str) // リストの中から"晴れ"のみを抽出
.forEach(System.out::println); // 要素の出力
}
// 引数のリストから偶数のみを格納したリストを返す
private List<Integer> task3(List<Integer> intList) {
List<Integer> resultList = new ArrayList<>();
intList.stream().filter(i -> i % 2 == 0); // 要素を2で割って余りが0の要素を抽出
(i -> resultList.add(i)); // 結果用リストに格納
// 結果用のリストを返却する
return resultList;
}
// 引数のリストから重複している要素を除外したリストを返す
private List<String> task4(List<String> strList) {
List<String> resultList = new ArrayList<>();
strList.stream().distinct() // 要素をequalsで比較し、重複した要素を除く
.forEach(str -> strList); // 結果用リストに格納
// 結果用のリストを返却する
return resultList;
}
// 引数の年月日から6ヵ月前の年月日を返す(変更前)
private String task5(String strDate) {
String resultDate = LocalDate.parse(strDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")) // 文字列から日付へ変換する
// 月から6を引く
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // 引数の書式で文字列に再変換する
return resultDate;
}
/
// 引数の年月日から6ヵ月前の年月日を返す(変更後)
private String task5(String strDate) {
String resultDate = LocalDate.parse(strDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")) // 文字列から日付へ変換する
// 月から6を引く
LocalDate.of(2016,06,26).minusMonths(-6)
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // 引数の書式で文字列に再変換する
return resultDate;
}

//実行時のコード

// strListの中から一意の要素を取り出す
System.out.println(answer.task4(strList));

// 6ヵ月前の年月日を表示する System.out.println(answer.task5("2016-06-26"));

###試したこと
参考書やサイトを見ながら自分なりに実装

###補足情報(言語/FW/ツール等のバージョンなど)
使用言語:Java
使用ツール:STS
使用OS:Windows10

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

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

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

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

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

guest

回答3

0

・引数のリストから最大値を取得させるところの

Optional<Integer> max = intLits.max(Comparator.naturalOrder());

のintLits.maxのmaxのところで

The method max(Comparator.naturalOrder()) is undefined for the type List<Integer>
というエラーが出てしまい対処法が不明

ListをStreamに変換しないと、ご提示の操作はできません。

java

1Optional<Integer> max = intLits.stream().max(Comparator.naturalOrder());

・特定の文字を抽出させる方法が不明

java

1strList.stream().filter(str -> str) // リストの中から"晴れ"のみを抽出

ここでしょうか?filterの引数には条件に合うものにtrueを返すように設計すればいいので、

java

1strList.stream().filter(str -> str.equals("晴れ")) // リストの中から"晴れ"のみを抽出

・偶数のみを格納したリストを

結果用のリストに格納させたいが
(i -> resultList.add(i));のところで
Multiple markers at this line

Syntax error, insert "AssignmentOperator Expression" to complete

Expression
Syntax error, insert ")" to complete Expression
というエラーが出てしまい対処に困っている

この直前でセミコロンにより文が切れています。前のStreamに続けて操作しないと意味をなしません。

java

1intList.stream().filter(i -> i % 2 == 0) // 要素を2で割って余りが0の要素を抽出 2.forEach(i -> resultList.add(i)); // 結果用リストに格納

ただ、ここや他にもリスト化するのにArrayListを別途用意してStreamから取り出した要素を詰めるという手順を踏んでいるところがありますが、、Streamの要素をList化するのに便利なcollectメソッドがあります。

java

1List<Integer> resultList = intList.stream().filter(i -> i % 2 == 0) 2 .collect(Collectors.toList());

・引数の月から半年前の日付を表示させる方法(関数)が不明

LocalDateクラスのminusMonthsメソッドを使います。

投稿2016/06/25 15:39

swordone

総合スコア20651

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

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

退会済みユーザー

退会済みユーザー

2016/06/25 20:40

回答ありがとうございます。 最大値の取得、特定の文字の表示、特定の数を格納したリストを返す実装については無事に解決いたしました。 しかし // 引数のリストから重複している要素を除外したリストを返す private List<String> task4(List<String> strList) { List<String> resultList = new ArrayList<>(); strList.stream().distinct() // 要素をequalsで比較し、重複した要素を除く .forEach(str -> strList); // 結果用リストに格納 // 結果用のリストを返却する return resultList; } のforEachとstrListにおいて - Void methods cannot return a value - The method forEach(Consumer<? super String>) in the type Stream<String> is not applicable for the arguments ((<no type> str) -> {}) というエラーが発生してしまっていること、さらに LocalDateクラスのminusMonthsメソッドを使用してみたのですが String resultDate = LocalDate.parse(strDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"))のところで 以下のエラーが発生してしまいました。 Type mismatch: cannot convert from LocalDate to String 参考までに記入したソースコードを追記しますので訂正点を教えていただけると幸いです。 ソースコード private String task5(String strDate) { String resultDate = LocalDate.parse(strDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")) // 文字列から日付へ変換する // 月から6を引く LocalDate.of(2014,05,01).minusMonths(-6) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // 引数の書式で文字列に再変換する return resultDate; }
swordone

2016/06/26 00:08

どっちもコード化が中途半端です。 前者は回答コードをよく見てください。私はforEachで何をしていますか? 後者は、私はコードの流れ的にメソッドチェーンで書こうとしていると思ったのですが… parseの結果に続けてピリオドを打ち、minusMonthsを書きます。これに後のformatが続くようにします。 あとminusMonthsに-6を渡すと結果が逆になりますよ。
退会済みユーザー

退会済みユーザー

2016/06/26 00:32

無事に解決いたしました。 懇切丁寧に教えていただきありがとうございました。 また何か問題が発生した際には宜しくお願い致します。
guest

0

ベストアンサー

swordoneさんの回答のコメントに対するレスです。

// 引数のリストから重複している要素を除外したリストを返す

private List<String> task4(List<String> strList) {
List<String> resultList = new ArrayList<>();
strList.stream().distinct() // 要素をequalsで比較し、重複した要素を除く
.forEach(str -> strList); // 結果用リストに格納

// 結果用のリストを返却する
return resultList;
}
のforEachとstrListにおいて

  • Void methods cannot return a value
  • The method forEach(Consumer<? super String>) in the type Stream<String> is not

applicable for the arguments ((<no type> str) -> {})

というエラーが発生してしまっていること

.forEachの中がおかしいです。
結果用リストに格納なのになぜ引数のstrListを指定してるのですか。
task3と同じ要領で下記のようにresultListを指定してください。

Java

1.forEach(str -> resultList.add(str)); // 結果用リストに格納

また、

LocalDateクラスのminusMonthsメソッドを使用してみたのですが

そのコメントしてくれたtask5メソッドも変です
strDateから引っ張ってるのにそこに直接LocalDate.of(2014,05,01)と入れてどうするの。
.(ピリオド)でつなげればいいんです。

Java

1// 引数の年月日から6ヵ月前の年月日を返す 2public String task5(String strDate) { 3 String resultDate = LocalDate.parse(strDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")) // 文字列から日付へ変換する 4 // 月から6を引く(-6じゃないよ!!) 5 .minusMonths(6) 6 .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // 引数の書式で文字列に再変換する 7 return resultDate; 8} 9

あと見てみたら最初の質問を編集してますね。
レスがついた後なのに最初の質問を編集してしまうと、話の流れが分からなくなります。
やらない方が賢明ですよ。

投稿2016/06/26 00:14

編集2016/06/26 00:20
phoenix3430025

総合スコア135

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

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

退会済みユーザー

退会済みユーザー

2016/06/26 00:31

無事に解決いたしました。 懇切丁寧に教えていただきありがとうございました。 また何か問題が発生した際には宜しくお願い致します。 追伸:質問の編集についてですが    始めたばかりで使用方法がわからない点がありますが以後気を付けます
guest

0

それぞれをテストクラスも含めて記載しましたのでご参考に。

java

1import static org.junit.Assert.*; 2 3import java.time.LocalDate; 4import java.util.Arrays; 5import java.util.Comparator; 6import java.util.List; 7import java.util.Optional; 8import java.util.stream.Collectors; 9 10import org.junit.Before; 11import org.junit.Test; 12 13/** 14 * 15 * @author A-pZ 16 */ 17public class StreamSampleTest { 18 19 @Before 20 public void setUp() throws Exception { 21 } 22 23 @Test 24 public void testMax() { 25 List<Integer> integerList = Arrays.asList(1,2,4,8,16,320,64,128,256); 26 27 Optional<Integer> max = integerList.stream().max(Comparator.comparingInt(i1 -> i1.intValue())); 28 29 assertNotEquals(null, max.get()); 30 assertEquals(320L , (long)max.get()); 31 } 32 33 @Test 34 public void testWeather() { 35 List<String> weather = Arrays.asList("雨","晴れ","くもり","快晴","大雨"); 36 37 Optional<String> result = weather.stream().filter(w -> w.equals("晴れ")).findAny(); 38 39 assertNotEquals(null,result.get()); 40 assertEquals("晴れ",result.get()); 41 } 42 43 public void testEven() { 44 List<Integer> numberList = Arrays.asList(1,3,5,7,9,0,2,4,6,8,13,35,72,100); 45 46 List<Integer> evenList = numberList.stream().filter(i -> i % 2 == 0).collect(Collectors.toList()); 47 48 assertTrue(evenList.contains(0)); 49 assertTrue(evenList.contains(2)); 50 assertTrue(evenList.contains(4)); 51 assertTrue(evenList.contains(6)); 52 assertTrue(evenList.contains(8)); 53 assertTrue(evenList.contains(72)); 54 assertTrue(evenList.contains(100)); 55 assertFalse(evenList.contains(1)); 56 assertFalse(evenList.contains(3)); 57 assertFalse(evenList.contains(5)); 58 assertFalse(evenList.contains(7)); 59 assertFalse(evenList.contains(9)); 60 assertFalse(evenList.contains(13)); 61 assertFalse(evenList.contains(35)); 62 } 63 64 @Test 65 public void testDistinct() { 66 List<String> duplicate = Arrays.asList("雨","晴れ","くもり","晴れ","晴れ","雨"); 67 68 List<String> result = duplicate.stream().distinct().collect(Collectors.toList()); 69 70 assertEquals(1, result.stream().filter(d -> d.equals("晴れ")).count()); 71 assertEquals(1, result.stream().filter(d -> d.equals("雨")).count()); 72 assertEquals(1, result.stream().filter(d -> d.equals("くもり")).count()); 73 assertEquals(0, result.stream().filter(d -> d.equals("曇り")).count()); 74 } 75 76 @Test 77 public void before6Month() { 78 LocalDate ldate = LocalDate.of(2016, 8, 8); 79 LocalDate check = ldate.minusMonths(6); 80 81 assertEquals(2016 , check.getYear()); 82 assertEquals(2 , check.getMonthValue()); 83 assertEquals(8 , check.getDayOfMonth()); 84 } 85 86 @Test 87 public void before6MonthOverYeae() { 88 LocalDate ldate = LocalDate.of(2016, 3, 25); 89 LocalDate check = ldate.minusMonths(6); 90 91 assertEquals(2015 , check.getYear()); 92 assertEquals(9 , check.getMonthValue()); 93 assertEquals(25 , check.getDayOfMonth()); 94 } 95 96}

投稿2016/06/25 23:29

A-pZ

総合スコア12011

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

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

退会済みユーザー

退会済みユーザー

2016/06/26 00:05

回答ありがとうございます。 最大値の取得、特定の文字の表示、特定の数を格納したリストを返す実装については無事に解決いたしました。 しかし // 引数のリストから重複している要素を除外したリストを返す private List<String> task4(List<String> strList) { List<String> resultList = new ArrayList<>(); strList.stream().distinct() // 要素をequalsで比較し、重複した要素を除く .forEach(str -> strList); // 結果用リストに格納 // 結果用のリストを返却する return resultList; } のforEachとstrListにおいて - Void methods cannot return a value - The method forEach(Consumer<? super String>) in the type Stream<String> is not applicable for the arguments ((<no type> str) -> {}) というエラーが発生してしまっていること、さらに LocalDateクラスのminusMonthsメソッドを使用してみたのですが String resultDate = LocalDate.parse(strDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"))のところで 以下のエラーが発生してしまいました。 Type mismatch: cannot convert from LocalDate to String 参考までに記入したソースコードを追記しますので訂正点を教えていただけると幸いです。 ソースコード private String task5(String strDate) { String resultDate = LocalDate.parse(strDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")) // 文字列から日付へ変換する // 月から6を引く LocalDate.of(2014,05,01).minusMonths(-6) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // 引数の書式で文字列に再変換する return resultDate; }
退会済みユーザー

退会済みユーザー

2016/06/26 00:32

無事に解決いたしました。 懇切丁寧に教えていただきありがとうございました。 また何か問題が発生した際には宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問