(追記)2020/08/19
1. Listが空の場合(NoSuchElementException)に対応しました。
2. Nullが含まれていた場合、空文字として扱うように修正しました。
1. Listが空の場合(NoSuchElementException)に対応しました。
2. Nullが含まれていた場合、空文字として扱うように修正しました。
ArrayList<String>に格納されている文字列のうち、最大長であるものを簡単に取り出す方法です。
普通に考えたら、forで回してlenghtがMaxになるものを取得するというものですが、
ここではstreamを使って 1行 簡単に取得します。
注)streamはJava8以降で利用可能です。
目次
ソースコード
maxString()が最大文字列長を取得するメソッドです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package samples.stream.main; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class StringList { private List<String> _strList = new ArrayList<String>(); public void add(String str) { _strList.add(str); } public String maxString() { if(_strList.isEmpty()) return null; return _strList.stream() .map(s -> s == null ? "" : s) .max(Comparator.comparing(String::length)).get(); } } |
解説
_strListの要素がNULLの場合は空文字に置換し、
そうでない場合はその文字列をそのまま返します。
指定されたComparator(全体順序付けを行う比較関数)の最大要素を返します。
これにより、Comparatorで比較した最大値が返ってきます。
比較するためのキーとして、String型のlengthを指定します。
これにより、文字列の長さで比較します。
値を返します。
よって、String型のlengthで比較して最大となる値を返すことができます。
テストコード(おまけ)
検証したテストコードです。
今後は、public static void main(String…strings) で例示するのではなく、
TDDの学習も兼ねて、テストコードで例示していきたいと思っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
package samples.stream.test; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; import samples.stream.main.StringList; class StreamMaxTest { @Test void ArrayList_String_内で最大長となる文字列を返す() { StringList stringList = new StringList(); stringList.add(""); stringList.add(null); stringList.add("12345"); stringList.add("1234567890"); String str = stringList.maxString(); assertThat("1234567890", is(str)); } @Test void ArrayList_String_が空の場合はNULLを返す() { StringList stringList = new StringList(); String str = stringList.maxString(); assertThat(null, is(str)); } @Test void ArrayList_String_がNULLの場合は空文字を返す() { StringList stringList = new StringList(); stringList.add(null); String str = stringList.maxString(); assertThat("", is(str)); } } |
コメント