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

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

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

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

Q&A

解決済

3回答

2909閲覧

streamについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2017/11/07 13:11

/** *文字列を分割して変換する */ private String changeword(String word, String name) { StringBuilder changingWord= new StringBuilder(); String[] searchWord = word.split(""); Arrays.stream(searchWord).forEach(w -> { if (w == "a") { changingWord.append(w.replace(w, "A")); } else if (w == "b") { changingWord.append(w.replace(w, "C")); } else if (w == "c") { changingWord.append(w.replace(w, "0")); } else { changingWord.append(w.replace(w, "$$")); } }); String result = name+ "=",changingWord.toString()); return result; }

上記の文字列を分割し、変換した結果を表示するメソッドをラムダ式をより使用し、記述できますか?
例えば、if文をfilter()を使用したり、最後にcollect()を使用したり、
String[] searchWord = word.split("");の記述をStringJoinerクラスを使用したりして、実装できますか?
よりラムダ式を使用して、記述したいですが、イメージがわきません。
教えていただけるとありがたいです。
よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

質問者さんは、1文字ずつ分離するのにsplit("")を使っておられますが、それは直接的でないように感じました。文字列を1文字ずつのストリームへ変換するString#codePointsメソッド(※)がありますのでそれを用いた方がより直接的であるように感じます。

java

1import java.util.stream.Collectors; 2 3public class StreamTest { 4 public static void main(String[] args) { 5 System.out.println(changeWord("abcd", "NAME")); 6 7 } 8 9 static private String changeWord(String word, String name) { 10 return name + "=" + word.codePoints() 11 .mapToObj(StreamTest::mapCodePointToString) 12 .collect(Collectors.joining()); 13 } 14 15 // このメソッドを定義せずともchangeWord内に記述してもかまわないです。 16 // 単に個人的好みで分けて定義したに過ぎません。 17 static private String mapCodePointToString(int codePoint) { 18 switch (codePoint) { 19 case 'a': return "A"; 20 case 'b': return "C"; 21 case 'c': return "0"; 22 default: return "$$"; 23 } 24 } 25}

※:似たメソッドにString#charsがありますが、これはサロゲートペアをばらばらの要素に分解してしまうため、携帯用絵文字や拡張領域の漢字などcharが2つで一文字となるような文字が有り得ることを考えるとString#codePointsの方が素直な選択のように思います。

投稿2017/11/07 14:15

KSwordOfHaste

総合スコア18394

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

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

KSwordOfHaste

2017/11/07 15:12 編集

自分は見易さからストリーム処理の外側でname,"="を連結しました。しかし、効率のことを配慮すればroot_jpさん回答のようにjoiningへ指定する方がベターではないかと推測します。
root_jp

2017/11/08 00:59

> String#codePoints うおーこんな便利なメソッドがあったなんて。 @since 1.8 知らなかった。。ありがとうございますw
swordone

2017/11/08 01:03

CharSequenceのデフォルトメソッドになってて目立ちにくいですからね。
guest

0

一旦文字列に変換するのが嫌だったので

java

1public class Q99560 { 2 public static void main(String[] args) { 3 System.out.println(changeWord("abcd", "NAME")); 4 5 } 6 7 static private String changeWord(String word, String name) { 8 return IntStream.concat(new StringBuilder(name).append('=').codePoints(), 9 word.codePoints().flatMap(Q99560::mapCodePoint)) 10 .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) 11 .toString(); 12 } 13 14 static private IntStream mapCodePoint(int codePoint) { 15 switch (codePoint) { 16 case 'a': 17 return IntStream.of('A'); 18 case 'b': 19 return IntStream.of('C'); 20 case 'c': 21 return IntStream.of('0'); 22 default: 23 return IntStream.of('$', '$'); 24 } 25 } 26}

最後の変換までStringを避けようとしていたらやたら冗長になった気がする

投稿2017/11/07 15:37

編集2017/11/07 15:58
swordone

総合スコア20651

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

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

KSwordOfHaste

2017/11/07 16:48

joiningにまかせず、collectの3引数版を用いてint(codepoint)のまま連結する点が面白いと思いました。 ただmapCodePointでIntStreamを生成する際に少なくとも1文字あたり2つオブジェクトがnewされるので効率がどうなのか興味がわきました。
swordone

2017/11/07 16:54

まあIntStreamだとCollectorが使えませんからね… 1文字あたり2つのオブジェクトとは?ofに渡しているのはプリミティブな値なので オブジェクトは1つしかnewされていないと思いますが…
KSwordOfHaste

2017/11/07 17:07

IntStream.ofの実装をちょこっと見ただけですが、Streams.IntStreamBuilderImplとIntPipeline.Headの2つの小さなオブジェクトがnewされているようでした。
guest

0

Java

1private String changeword(String word, String name) { 2 return Arrays.stream(word.split("")).map(w -> { 3 switch (w) { 4 case "a": 5 return "A"; 6 case "b": 7 return "C"; 8 case "c": 9 return "0"; 10 default: 11 return "$$"; 12 } 13 }).collect(Collectors.joining("", name + "=", "")); 14}

投稿2017/11/07 13:32

root_jp

総合スコア4666

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問