Javaで「文字列のリスト」から「文字数の合計」を表示する処理を Streamを用いて記述する方法
Javaのリストで文字列を扱っている時に、その文字数を取得したい
以下の問題を通じて、
JavaリストにおいてString型のデータからInt型の処理を行うことができるようになります
問題を通じて確認していきましょう。
var strs = List.of("google", "amazon", "facebook", "apple");
という文字列のリストがある時に、6文字以上のものの文字数の合計を表示する処理をStreamを用いて記述しなさい。
最初に私はこのようなコードを書きましたが、エラーが出ました。
どこにエラーの原因があるのでしょうか?
strs.stream().filter(s -> s.length() >= 6).mapToInt(s -> s).sum()
| エラー:
| 不適合な型: ラムダ式の戻り型が不正です
| java.lang.Stringをintに変換できません:
| strs.stream().filter(s -> s.length() >= 6).mapToInt(s -> s).sum()
| ^
【原因】
mapToIntに対してはint型を返す必要があります。(s -> s)ですと、文字列がそのまま文字列で渡されているのでint型になっていません。
では、String型のデータの値を、int型に変換して文字数を取得するにはどうすればいいのでしょうか?
【解答】
strs.stream().filter(s -> s.length() >= 6).mapToInt(s -> s.length()).sum()
$36 ==> 20
google 6文字
amazon 6文字
facebook 8文字
-> 合計20文字!!
それでは、要素を分解して解説していきます。
Streamでコードを記述するメリット
まず、Streamでコードを記述するメリットは何かというと、
変数の記述量ができるだけ削減されるとともに、メソッドが連なって記述されることによって処理の流れが一目瞭然に分かり、コードの可読性が向上するということにあります。
Stream処理の書き方
Streamでは、メソッド呼び出しを続けて書くメソッドチェーンの形で書きます。
Stream処理では、Streamソース、中間操作(値を操作する)、**終端処理(値をまとめる)**という3ステップで記述します。
コードの解説
strs.stream()
この部分は、Streamソースで、Streamの取り出し口として機能しています。
ListからStreamを取り出すときに使うのが、streamメソッドです。
streamメソッド書き方
(List名).stream()
filter(s -> s.length() >= 6)
この部分では中間処理として、Listから取り出す値をフィルタリングして抽出する処理です。
ここでは、対象となるListを取り敢えず「s」と置いて、そのList要素の文字列の長さが6以上の値を抽出しています。
mapToInt(s -> s.length())
この部分では、String型のListの要素の「文字数(Int型の情報)」を取り出しています。
sum()
ここでは、終端処理として、取り出したListの各要素の文字数の値を合計しています。
まとめ
文字列のリストを取り扱って、streamの中間処理でそのまま s -> ◯◯とすると、そのまま文字列扱いになります。
なので、String型の素材を使ったデータをもとに、int型の処理を行う際には、
「.length」のようなint型を返すメソッドを式に与える必要があります。
最後に、
Javaを勉強するなら、「プロになるJava」がおすすめです!
実際、私も独学で学習しておりますが、著者の方々がLINEのオープンチャットで直々に質問対応してくれる最高のアフターサービスを備えており、最高のJava入門書のうちの一つと言えます。
わたくし筆者も、Javaエンジニアとしての実力を高めるために学習するとともに、
テック系の記事を投稿して参りますので、フォローして下さいますと励みになります!!
それでは、ごきげんよう!
Discussion