Takahiro Octopress Blog

-1から始める情弱プログラミング

SwiftとJava8とJavaScriptでreduce / Filter / Map / flatMap

SwiftとJava8とJavaScriptを比較してみよう!

本日は前々から気になっていた『SwiftとJava8とJavaScript』の比較をしてみたいと思います。
と言っても難しいことをやるわけではなく、今回はreduce, filter, map, flatMapメソッドの書き方を比較してみます。

筆者個人としては、どうしてもSwiftやJava8から書き方やメソッドの意味の理解を始めようとすると時間がかかってしまいます。
なので、JavaScriptから入って比較することで理解が促進することがあるのです。

では早速見ていきましょう。

reduceメソッド

まずはreduceメソッドです。

JavaScript
1
2
3
4
5
6
var array = [1, 2, 3, 4, 5];
var reduced = array.reduce(function(previus, current) {
  return previous + current;
}, 0);

// 結果 -> 15
Swift
1
2
3
4
5
6
let array = [1, 2, 3, 4, 5]
let reduced = array.reduce(0) { (previous, current) -> Int in
  previous + current
}

// 結果 -> 15
Java8
1
2
3
4
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = list.stream().reduce((previous, current) -> previous + current);

// 結果 -> 15

filterメソッド

次にfilterメソッドです。

JavaScript
1
2
3
4
5
6
var array = [1, 50, 800, 3, 44];
var filtered = array.filter(function(elem) {
  return elem >= 10;
});

// 結果 -> [50, 800, 44]
Swift
1
2
3
4
5
6
let array = [1, 50, 800, 3, 44]
var filtered = array.filter { (elem) -> Bool in
  elem >= 10
}

// 結果 -> [50, 800, 44]
Java8
1
2
3
4
5
List<Integer> list = Arrays.asList(1, 50, 800, 3, 44);
List<Integer> filteredList = new ArrayList<Integer>();
list.stream().filter(elem -> elem >= 10).forEach(elem -> filteredList.add(elem));

// 結果 -> [50, 800, 44]

mapメソッド

続いてmapメソッドです。

JavaScript
1
2
3
4
5
6
var array = [1, 2, 3, 4, 5];
var mapped = array.map(function(elem) {
  return elem * elem;
});

// 結果 -> [1, 4, 9, 16, 25]
Swift
1
2
3
4
5
6
let array = [1, 2, 3, 4, 5]
var mapped = array.map { (elem) -> Int in
  elem * elem
}

// 結果 -> [1, 4, 9, 16, 25]
Java8
1
2
3
4
5
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> mappedList = new ArrayList<Integer>();
list.stream().map(elem -> elem * elem).forEach(elem -> mappedList.add(elem));

// 結果 -> [1, 4, 9, 16, 25]

flatMapメソッド

最後にflatMapメソッドです。
(と言いつつ、処理の意味的にはflattenしか入っていませんね…)

JavaScript

JavaScriptでは標準でflatMapメソッドは実装されていません。
自作するしかないわけですが、flatMap = flatten + mapなので下記のように書けます。

1
2
3
4
5
6
var listArrayList = [[1, 2], [3], [4, 5]]
var flatMappedList = Array.prototype.concat.apply([], listArrayList).map(function(elem) {
  return elem;
});

// 結果 -> [1, 2, 3, 4, 5]
Swift
1
2
3
4
5
6
7
8
9
10
11
12
13
var listArrayList:[Int]] = []
let list1: [Int] = [1, 2]
let list2: [Int] = [3]
let list3: [Int] = [4, 5]
listArrayList.append(list1)
listArrayList.append(list2)
listArrayList.append(list3)
                                              
let flatMappedList = listArrayList.flatMap { (elem) -> [Int] in
  return elem
}

// 結果 -> [1, 2, 3, 4, 5]
Java8
1
2
3
4
5
6
7
8
9
10
11
List<List<Integer>> listArrayList = new ArrayList<List<Integer>>();
List<Integer> list1 = Arrays.asList(1, 2);
List<Integer> list2 = Arrays.asList(3);
List<Integer> list3 = Arrays.asList(4, 5);
listArrayList.add(list1);
listArrayList.add(list2);
listArrayList.add(list3);
List<Integer> flatMappedList = new ArrayList<Integer>();
listArrayList.stream().flatMap(elem -> elem.stream()).forEach(elem -> flatMappedList.add(elem));

// 結果 -> [1, 2, 3, 4, 5]

さていかがでしたでしょうか?
1つの言語を極めれば、何となく他の言語でも書き方がわかるという話を聞いたりすると思うのですが、こういったことの延長戦にある話なんだろうなと思ったりました。
と言ったところで本日はここまで。

Comments