1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Java】ArrayListの最長文字列をstreamを使って簡単に取得する方法

Last updated at Posted at 2020-08-17

ArrayList<String>に格納されている文字列のうち、最大長であるものを簡単に取り出す方法です。
普通に考えたら、forで回してlenghtがMaxになるものを取得するというものですが、
ここではstreamを使って 1行で 簡単に取得します。

追記)2020/08/19

  1. ご指摘により、Listが空の場合(NoSuchElementException)に対応しました。
  2. 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));
    }
}
1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?