ArrayList<String>に格納されている文字列のうち、最大長であるものを簡単に取り出す方法です。
普通に考えたら、forで回してlenghtがMaxになるものを取得するというものですが、
ここではstreamを使って 1行で 簡単に取得します。
追記)2020/08/19
- ご指摘により、Listが空の場合(NoSuchElementException)に対応しました。
- Nullが含まれていた場合、空文字として扱うように修正しました。
注)streamはJava8以降で利用可能です。
ソースコード
maxString()が最大文字列長を取得するメソッドです。
StringList.java
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();
}
}
解説
- .map(s -> s == null ? "" : s)
_strListの要素がNULLの場合は空文字に置換し、そうでない場合はその文字列をそのまま返します。
- max(
指定されたComparator(全体順序付けを行う比較関数)の最大要素を返します。
これにより、Comparatorで比較した最大値が返ってきます。
- Comparator.comparing(String::length)
比較するためのキーとして、String型のlengthを指定します。
これにより、文字列の長さで比較します。
- .get()
値を返します。
よって、String型のlengthで比較して最大となる値を返すことができます。
テストコード(おまけ)
検証したテストコードです。
今後は、public static void main(String...strings) で例示するのではなく、
TDDの学習も兼ねて、テストコードで例示していきたいと思っています。
StreamMaxTest.java
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));
}
}