LoginSignup
25
24

More than 5 years have passed since last update.

言語・ライブラリごとのリストやマップ用の便利メソッド使い方比較メモ

Last updated at Posted at 2014-09-16

each() とか map() とか、リストやマップを操作する便利メソッドについて、言語ごとにどう書くかのメモ。

対象は、自分がよく使う Java(8 以上), Groovy, JavaScript(Underscore.js, jQuery) だけ。

リストの各要素を順次処理する

Java

import java.util.Arrays;
...

Arrays.asList(1, 2, 3, 4).forEach(System.out::println);

Groovy

[1, 2, 3, 4].each {println it}

JavaScript

コールバックの引数の順序が異なるので注意。

Underscore.js

_.each([1, 2, 3, 4], function(e, i, array) {
    console.log(e);
});

jQuery

$.each([1, 2, 3, 4], function(i, e) {
    console.log(e);
});

リストの中から条件に一致する要素だけを抽出したリストを取得する

Java

import java.util.Arrays;
...

Arrays.asList(1, 2, 3, 4).stream()
                         .filter(i -> i % 2 == 0)
                         .forEach(System.out::println);

Groovy

[1, 2, 3, 4].findAll {it % 2 == 0}
            .each {println it}

JavaScript

Underscore.js

var array = _.filter([1, 2, 3, 4], function(e) {
    return e % 2 === 0;
});

console.log(array);

jQuery

var array = $.grep([1, 2, 3, 4], function(e, i) {
    return e % 2 === 0;
});

console.log(array);

each とは引数の順番が逆になっているので注意。

リストの中から条件に一致する先頭の要素を取得する

Java

import java.util.Arrays;
import java.util.Optional;
...

Optional<Integer> result = Arrays.asList(1, 2, 3, 4).stream()
                                                    .filter(i -> i % 2 == 0)
                                                    .findFirst();

System.out.println(result.get());

Groovy

println([1, 2, 3, 4].find {it % 2 == 0})

JavaScript

Underscore.js

console.log(_.find([1, 2, 3, 4], function(e) {
    return e % 2 === 0;
}));

jQuery

なし

リストの全要素が指定した条件を満たすか確認する

Java

import java.util.Arrays;
...

boolean result = Arrays.asList(1, 2, 3, 4).stream().allMatch(i -> i < 10);

System.out.println(result);

Groovy

println([1, 2, 3, 4].every {it < 10})

JavaScript

Underscore.js

console.log(_.every([1, 2, 3, 4], function(e) {
    return e < 10;
}));

jQuery

なし

リストの要素のうち、いずれかが指定した条件を満たすことを確認する

Java

boolean result = Arrays.asList(1, 2, 3, 4).stream().anyMatch(i -> i == 3);

System.out.println(result);

Groovy

println([1, 2, 3, 4].any {it == 3})

JavaScript

Underscore.js

console.log(_.any([1, 2, 3, 4], function(e) {
    return e === 3;
}));

jQuery

なし

リストの各要素を処理して別の値に変換し、変換後の値で構築された新しいリストを取得する

Java

import static java.util.stream.Collectors.*;
import java.util.Arrays;
import java.util.List;
...

Arrays.asList(1, 2, 3, 4)
      .stream()
      .map(i -> i * 10)
      .forEach(System.out::println);

Groovy

[1, 2, 3, 4].collect {it * 10}
            .each {println it}

JavaScript

Underscore.js

var array = _.map([1, 2, 3, 4], function(e) {
    return e * 10;
});

console.log(array);

jQuery

var array = $.map([1, 2, 3, 4], function(e, i) {
    return e * 10;
});

console.log(array);

リストの各要素から数値を取得し、その合計を取得する

Java

import java.util.Arrays;
...

int sum = Arrays.asList("1", "12", "123", "1234")
                .stream()
                .mapToInt(s -> s.length())
                .sum();

System.out.println(sum);

collect(Collectors.summingInt())reduce() を使う方法もある。

Groovy

println(["1", "12", "123", "1234"].inject(0, {memo, s -> memo + s.length()}))

println(["1", "12", "123", "1234"].collect {it.length()}.sum())

JavaScript

Underscore.js

var sum = _.reduce(['1', '12', '123', '1234'], function(memo, s) {
    return memo + s.length;
}, 0);

console.log(sum);

jQuery

なし

入れ子になったリストの要素を全て抽出して、1つのリストに入れ替える

Groovy と Underscore.js は、深くネストされたリストでも、再帰的に要素を抽出して平らにしてくれる。
Java の実装例では、1階層までしか見に行かないので、完全に平らにはならない。

Java

import java.util.Arrays;
import java.util.List;
...

List<Integer> list1 = Arrays.asList(1, 2);
List<Integer> list2 = Arrays.asList(3, 4);
List<Integer> list3 = Arrays.asList(5, 6);

Arrays.asList(list1, list2, list3)
      .stream()
      .flatMap(list -> list.stream())
      .forEach(System.out::println);

Groovy:

def array = [
    [1, 2],
    [3, 4],
    [5, 6]
]

println array.flatten()

JavaScript

Underscore.js

var array = [
    [1, 2],
    [3, 4],
    [5, 6]
];

console.log(_.flatten(array));

jQuery

なし

要素の重複を取り除く

Java

import java.util.Arrays;
...

Arrays.asList(3, 1, 2, 1, 4, 2, 3, 4)
      .stream()
      .distinct()
      .forEach(System.out::println);

比較には equals() メソッドが用いられる。

Groovy

println ([3, 1, 2, 1, 4, 2, 3, 4].unique())

クロージャーを渡すことで、任意の比較ロジックを指定できる。

JavaScript

Underscore.js

console.log( _.uniq([3, 1, 2, 1, 4, 2, 3, 4]) );

比較には === 演算子が用いられる。

jQuery

なし

リストをソートする

Java

import java.util.Arrays;
import java.util.List;
...

List<Integer> list = Arrays.asList(4, 1, 3, 2);
list.sort(Integer::compare);
System.out.println(list);

Groovy

println( [4, 1, 3, 2].sort() )

JavaScript

Underscore.js

var array = _.sortBy([4, 1, 3, 2], function(e) {
    return e;
});

console.log(array);

第二引数の関数は、ソートで使用する値を返すように実装する(比較処理(comparator)を実装するわけではない)。

jQuery

なし。

リストの中で最小の要素を取得する

各言語、最大の場合は max に変わるだけ。

Java

import java.util.Arrays;
import java.util.Optional;
...

Optional<Integer> min = Arrays.asList(1, 2, 3, 4).stream().min(Integer::compare);
System.out.println(min.get());

Groovy

println([1, 2, 3, 4].min())

JavaScript

Underscore.js

var min = _.min([1, 2, 3, 4]);
console.log(min);

jQuery

なし

マップの各要素を順次処理する

Java

import java.util.HashMap;
import java.util.Map;
...

Map<String, String> map = new HashMap<>();
map.put("hoge", "HOGE");
map.put("fuga", "FUGA");
map.put("piyo", "PIYO");

map.forEach((key, value) -> {
    System.out.println(key + " : " + value);
});

Groovy

[hoge: 'HOGE', fuga: 'FUGA', piyo: 'PIYO'].each {key, value ->
    println "${key} : ${value}"
}

JavaScript

Underscore.js

var map = {hoge: 'HOGE', fuga: 'FUGA', piyo: 'PIYO'};

_.each(map, function(value, key, obj) {
    console.log(key + ' : ' + value);
});

jQuery

var map = {hoge: 'HOGE', fuga: 'FUGA', piyo: 'PIYO'};

$.each(map, function(key, value) {
    console.log(key + ' : ' + value);
});

マップの各エントリーを処理して最終的にリストに変換する

Java

import java.util.HashMap;
import java.util.Map;
...

Map<String, String> map = new HashMap<>();
map.put("hoge", "HOGE");
map.put("fuga", "FUGA");
map.put("piyo", "PIYO");

map.entrySet()
   .stream()
   .map(e -> e.getKey() + e.getValue())
   .forEach(System.out::println);

Groovy

[hoge: 'HOGE', fuga: 'FUGA', piyo: 'PIYO']
    .collect {it.key + it.value}
    .each {println it}

JavaScript

Underscore.js

var map = {hoge: 'HOGE', fuga: 'UGA', piyo: 'PIYO'};

var array = _.map(map, function(value, key) {
    return key + value;
});

console.log(array);

jQuery

var map = {hoge: 'HOGE', fuga: 'UGA', piyo: 'PIYO'};

var array = $.map(map, function(value, key) {
    return key + value;
});

console.log(array);

メソッド(関数)名対応表

Java Groovy Underscore.js jQuery
forEach each each each
filter findAll filter grep
- find find -
allMatch every every -
anyMatch any any -
map collect map map
reduce inject reduce -
flatMap flatten flatten -
distinct unique uniq -
sort sort sortBy -
min min min -
max max max -

参考

25
24
0

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
25
24