GS CollectionsからEclipse Collectionsへ - 機能

TECHNOLOGY
DIVISION
GS CollectionsからEclipse Collectionsへ
ー機能豊富なオープンソースJavaコレクションフレームワーク
ゴールドマン・サックス
テクノロジー部 ヴァイス・プレジデント
伊藤博志
#ccc_gh4
1
Agenda
•
•
•
•
•
•
•
#ccc_gh4
TECHNOLOGY
DIVISION
ゴールドマン・サックスのエンジニアリング
GS Collectionsとは?
Eclipse Collectionsとは?
基本的な初期化方法
Stream API & JCFとの比較例で見るEclipse Collectionsの利点
問題を解きながら学ぶEclipse Collections
今後のロードマップ
2
TECHNOLOGY
DIVISION
ゴールドマン・サックスのエンジニアリング
3
TECHNOLOGY
DIVISION
ゴールドマン・サックスのエンジニアリング
ゴールドマン・サックスとは
投資銀行業務、証券業務および投資運用業務を中心に、企業、金融機関、政府機関、富
裕層など多岐にわたるお客様を対象に幅広い金融サービスを提供している世界有数の金
融機関です。1869年に創業、ニューヨークを本拠地として、世界の主要な金融市場に拠点
を擁しています。
ゴールドマン・サックス エンジニアリング
複雑な問題へのソリューションの構築、時代を変えるテクノロジーの創出、ビジネスと金融
マーケットをグローバルに牽引するシステム開発を行っています。
http://www.goldmansachs.com/japan/what-we-do/engineering/index.html
4
TECHNOLOGY
DIVISION
ゴールドマン・サックスのエンジニアリング
最新オープン技術の牽引(グローバルの取り組み事例)
Open Compute Project
ハードウェアの計算効率を高め、運用コストを下げるためのオープンなハードウェア設計を共有し、
最適なデータセンター運用を目指すプロジェクト。
Open Container Initiative
コンテナ技術のフォーマットやラインタイムの業界標準を策定するためのプロジェクト。Dockerを
含む、30以上のコンテナ技術に関わる企業や組織が参加。
Java Community Process – Executive Committee
JCP Executive CommitteeはJavaプラットフォームの仕様策定における重要なプロセスを担う委
員会。ゴールドマン・サックスは2011年より本委員会の一員に選任。
5
TECHNOLOGY
DIVISION
ゴールドマン・サックスのエンジニアリング
Learn more at http://www.goldmansachs.com/japan/what-we-do/engineering/
6
#ccc_gh4
TECHNOLOGY
DIVISION
GS Collections
7
GS Collectionsとは?
#ccc_gh4
TECHNOLOGY
DIVISION
• ゴールドマン・サックスの開発したオープンソースコレク
ションフレームワーク
– Smalltalkに影響を受けたコレクションフレームワーク
– 2004年より開発を開始
– 2012年にGitHubにて公開 (Apache 2.0 License)
• github.com/goldmansachs/gs-collections
• GS Collections Kata
– 2007年に開発されたトレーニング教材
– 2,000人以上のGS Javaエンジニアが受講
– GitHubにて公開 (Apache 2.0 License)
• github.com/goldmansachs/gs-collections-kata
8
#ccc_gh4
TECHNOLOGY
人気上昇中
Spring ReactorがGS Collectionsを依存ライブラリに追加
DIVISION
Maven centralのダウンロード数がJavaOne 2014から右肩上がり
quote from: https://spring.io/blog/2014/05/06/reactor-1-1-0-release-now-available
GitHub内のスター数でJavaプロジェクトのTop 300入り
9
日本でも話題に
#ccc_gh4
TECHNOLOGY
DIVISION
Java Day Tokyo 2015やJJUG CCC 2015 Spring後にblogや
Twitterで話題に [1, 2, 3, 4, 5, 6, 7, 8, 9]
[出展]
[1] yy_yank. (2015, April 15). Javaのコレクションフレームワークで物足りないならGS Collections使ったほうが良いかもしれない [Blog post].
Retrieved from http://yyyank.blogspot.jp/2015/04/javagscollections.html
[2] mike_neck. (2015, Apr 16). GS-Collectionsはcode kataで練習すると面白い [Blog post]. Retrieved from http://mikeneck.hatenadiary.com/entry/2015/04/16/075014
[3] tokuhirom. (2015, Apr 16). GS Collections Kata をひと通りやった [Blog post]. Retrieved from http://blog.64p.org/entry/2015/04/16/094947
[4] opengl-8080. (2015, Apr 15). GS Collections 使い方メモ [Qiita post]. Retriefed from http://qiita.com/opengl8080/items/a13773e0653800e23323
[5] 俺九番. (2015, Sep 12). Javaコレクション系のライブラリ、GS Collections使いやすくて好きなので大体のプロジェクトやるときはまずこれ入れて
る [Twitter post]. Retrieved from https://twitter.com/orekyuu/status/642356311791767552
[6] Kiyoshi SATOH. (2015, Jun 22). GS CollectionsというJavaのコレクションのライブラリ。メソッドチェインで書けて、Java8のラムダ使えばJavaで
色々と関数型で書ける良い感じなライブラリ。 / “Java - GS Collections 使い方…” http://htn.to/utfBWD [Twitter post]. Retrieved from
https://twitter.com/stealthinu/status/612816288226787328
[7]よこな. (2015, Apr 15). 話題沸騰中やな〜 "Java - GS Collections 使い方メモ by @opengl_8080 on @Qiita http://qiita.com/opengl8080/items/a13773e0653800e23323 …" [Twitter post]. Retrieved from https://twitter.com/ihcomega/status/588348537156411392
[8] toshi_miura. (2015, Apr 11). JJUG CCCで一番心に刺さったこと。「GS Collections」使ってみっか・・・である。 [Twitter post]. Retrieved from
https://twitter.com/toshi_miura/status/586879465537417217
[9]eiryu@西新宿篇. (2015, Apr 10). GS Collectionsアツいな / 他43コメント http://b.hatena.ne.jp/entry/www.goldmansachs.com/gscollections/presentations/2015-04-08_JavaDayTokyo.pdf#tw?u=eiryu9 … “[PDF] ゴールドマン・サックスの Javaへの取り組み”
http://htn.to/v3CtWq [Twitter post]. Retrieved from https://twitter.com/eiryu/status/586316836729262080
10
#ccc_gh4
TECHNOLOGY
DIVISION
Eclipse Collections
11
Eclipse Collectionsとは?
#ccc_gh4
TECHNOLOGY
DIVISION
• Eclipse Collections 7.0
– Eclipse財団へ移管されたプロジェクト
•
https://projects.eclipse.org/projects/technology.collections
– 10月にプロポーザルが提出され、11月18日に正式プロジェクトと
して承認
– 現在レポジトリの移管作業中(12月リリース予定)
– EPL/EDLのデュアルライセンス
– 機能はGS Collections 7.0と同一
– パッケージ名が変更
• com.gs -> org.eclipse
• Eclipse Collections – Open for contributions!
12
#ccc_gh4
TECHNOLOGY
JavaOne2015 – Eclipse Collections by Example
DIVISION
13
Eclipse Collectionsの機能
#ccc_gh4
TECHNOLOGY
DIVISION
Eclipse Collections 7.0
Java 8 Stream API
-
関数型API
遅延実行のみ
逐次処理と並行処理
プリミティブ型
Stream (3種類)
拡張可能な
Collectors










即時 & 遅延, 逐次 & 並行
メモリ効率のよいコンテナ
プリミティブ型コンテナ(8種類す
べて)
イミュータブルなコンテナ
多彩なコンテナ型
多彩なイテレーションパターン
Withメソッドパターン
Targetメソッドパターン
共変な戻り値型
Java 5+ まで後方互換
Eclipse Collections ではStream APIも使え、
さらに便利な機能を備えています
プロジェクトに貢献することもできます!!
14
#ccc_gh4
TECHNOLOGY
DIVISION
基本的な初期化方法
15
初期化の方法(1)
#ccc_gh4
TECHNOLOGY
DIVISION
List, Set, Bag, Map, Multimap等、すべてのコンテナに対してファクトリメソッドが存在(of(), with()どちら でも同様の初期化が可能)
MutableList<String> mutableList = Lists.mutable.of("One", "One", "Two", "Three");
MutableList<String> mutableList = Lists.mutable.with("One", "One", "Two", "Three");
MutableSet<String> mutableSet = Sets.mutable.of("One", "One", "Two", "Three");
MutableBag<String> mutableBag = Bags.mutable.of("One", "One", "Two", "Three");
MutableMap<String, String> mutableMap = Maps.mutable.of("key1", "value1", "key2", "value2", "key3", "value3");
Multimap<String, String> multimapWithList = Multimaps.mutable.list.of("key1", "value1-1", "key1", "value1-2", "key2",
"value2-1");
それぞれMutable, Immutableのファクトリが存在
MutableList<String> mutableList = Lists.mutable.of(“One”, “Two”, “Three”);
ImmutableList<String> immutableList= Lists.immutable.of("One", "Two", "Three");
空のコレクションを作るにはempty(), of(), with()どれでも可
MutableList<String> mutableListWithBlank = Lists.mutable.empty();
MutableList<String> mutableListWithBlank = Lists.mutable.of();
MutableList<String> mutableListWithBlank = Lists.mutable.with();
List, Set, Map等のコンテナには要素数が少ない場合(6要素まで)にメモリ効率のよいFixedSize用のファクトリも存在
FixedSizeList<String> fixedSizeList= Lists.fixedSize.of("One", "Two");
16
初期化の方法(2)
#ccc_gh4
TECHNOLOGY
DIVISION
すべてのプリミティブコンテナに対してもファクトリメソッドが存在
MutableIntList intList = IntLists.mutable.of(1, 2, 3);
MutableLongList longList = LongLists.mutable.of(1L, 2L, 3L);
MutableCharList charList = CharLists.mutable.of('a', 'b', 'c');
MutableShortList shortList = ShortLists.mutable.of((short)1, (short)2, (short)3);
MutableByteList byteList = ByteLists.mutable.of((byte)1, (byte)2, (byte)3);
MutableBooleanList booleanList = BooleanLists.mutable.of(true, false);
MutableFloatList floatList = FloatLists.mutable.of(1.0f, 2.0f, 3.0f);
MutableDoubleList doubleList = DoubleLists.mutable.of(1.0, 2.0, 3.0);
IntIntervalを使うと範囲指定したintのコレクションを作成することが可能
IntInterval oneTo10 = IntInterval.fromTo(1, 10);// 1から10までのint
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
IntInterval oneTo10By3 = IntInterval.fromToBy(1, 10, 3); // 1から10まで3ずつ増分したint
// [1, 4, 7, 10]
IntInterval oddsFrom1To10 = IntInterval.oddsFromTo(1, 10); // 1から10までの奇数
// [1, 3, 5, 7, 9]
IntInterval evensFrom1To10 = IntInterval.evensFromTo(1, 10); // 1から10までの偶数
// [2, 4, 6, 8, 10]
17
#ccc_gh4
TECHNOLOGY
DIVISION
Stream API & JCFとの比較例で見る
Eclipse Collectionsの利点
18
#ccc_gh4
TECHNOLOGY
Eclipse Collections
Stream API
より簡潔に書ける
DIVISION
boolean result = this.people.stream().anyMatch(person -> person.hasPet(PetType.CAT));
long result = this.people.stream().filter(person -> person.hasPet(PetType.CAT)).count();
List<Person> peopleWithCats = this.people.stream().filter(person -> person.hasPet(PetType.CAT))
.collect(Collectors.toList());
boolean result = this.people.anySatisfy(person -> person.hasPet(PetType.CAT));
int result = this.people.count(person -> person.hasPet(PetType.CAT));
MutableList<Person> peopleWithCats = this.people.select(person -> person.hasPet(PetType.CAT));
19
#ccc_gh4
TECHNOLOGY
DIVISION
Stream API
より多くのケースでメソッド参照を活用できる
boolean result = this.people.stream().anyMatch(person -> person.hasPet(PetType.CAT));
long result = this.people.stream().filter(person -> person.hasPet(PetType.CAT)).count();
List<Person> peopleWithCats = this.people.stream().filter(person -> person.hasPet(PetType.CAT))
.collect(Collectors.toList());
Eclipse Collections
*Stream APIではメソッドに引数(この場合はPetType)を渡したいときにメソッド参照を使うことができない。
boolean result = this.people.anySatisfyWith(Person::hasPet, PetType.CAT);
int result = this.people.countWith(Person::hasPet, PetType.CAT);
MutableList<Person> peopleWithCats =this.people.selectWith(Person::hasPet, PetType.CAT);
20
#ccc_gh4
TECHNOLOGY
Eclipse Collections
Stream API
より高い可読性で記述できる
DIVISION
List<Person> peopleWithCats = this.people.stream().filter(person -> person.hasPet(PetType.CAT))
.collect(Collectors.toList());
List<Person> peopleWithoutCats = this.people.stream().filter(!person -> person.hasPet(PetType.CAT))
.collect(Collectors.toList());
Map<Boolean, List<Person>> peopleWithcatsAndNoCats = this.people.stream().collect(
Collectors.partitioningBy(person -> person.hasPet(PetType.CAT)));
peopleWithcatsAndNoCats.get(true);
peopleWithcatsAndNoCats.get(false);
MutableList<Person> peopleWithCats = this.people.select(person -> person.hasPet(PetType.CAT));
MutableList<Person> peopleWithoutCats = this.people.reject(person -> person.hasPet(PetType.CAT));
PartitionMutableList<Person> peopleWithcatsAndNoCats = this.people.partition(
person -> person.hasPet(PetType.CAT));
peopleWithcatsAndNoCats.getSelected();
peopleWithcatsAndNoCats.getRejected();
21
#ccc_gh4
TECHNOLOGY
DIVISION
Eclipse Collections
Stream API
再利用が可能
Stream<Integer> stream = Lists.mutable.with(1, 2, 3).stream();
Assert.assertEquals(1, stream.mapToInt(i -> i).min().getAsInt());
Assert.assertEquals(3, stream.mapToInt(i -> i).max().getAsInt());
// throws
java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)
at java.util.stream.IntPipeline.<init>(IntPipeline.java:91)
at java.util.stream.IntPipeline$StatelessOp.<init>(IntPipeline.java:592)
at java.util.stream.ReferencePipeline$4.<init>(ReferencePipeline.java:204)
at java.util.stream.ReferencePipeline.mapToInt(ReferencePipeline.java:203)
LazyIterable<Integer> lazy = Lists.mutable.with(1, 2, 3).asLazy();
Assert.assertEquals(1, lazy.collectInt(i -> i).min());
Assert.assertEquals(3, lazy.collectInt(i -> i).max());
22
#ccc_gh4
TECHNOLOGY
メモリ効率が良い(HashSet vs UnifiedSet)
DIVISION
60
50
JDK HashSet
Eclipse Collections UnifiedSet
Size (Mb)
40
30
20
10
0
Elements
Data collected by https://github.com/goldmansachs/gs-collections/tree/master/jmh-tests
23
#ccc_gh4
TECHNOLOGY
DIVISION
メモリ効率が良い(HashMap vs UnifiedMap)
45
40
35
JDK HashMap
Eclipse Collections UnifiedMap
Size (Mb)
30
25
20
15
10
5
0
Elements
Data collected by https://github.com/goldmansachs/gs-collections/tree/master/jmh-tests
24
#ccc_gh4
TECHNOLOGY
メモリ効率が良い(プリミティブコレクション)
DIVISION
25
JDK ArrayList
20
Eclipse Collections IntArrayList
Size (Mb)
15
10
5
0
Elements
Data collected by https://github.com/goldmansachs/gs-collections/tree/master/jmh-tests
25
#ccc_gh4
TECHNOLOGY
Eclipse
Collections
Java
Collections
より簡潔にExceptionの対処が記述できる
DIVISION
Appendable appendable = new StringBuilder();
List<String> jdkList = Arrays.asList("one");
// jdkList.forEach(appendable::append);
// Compile Error: incompatible thrown types java.io.IOException in method reference
jdkList.forEach(each -> {
try
{
appendable.append(each);
}
catch (IOException e)
{
throw new RuntimeException(e);
}
});
Assert.assertEquals("one", appendable.toString());
ImmutableList<String> eclipseList = Lists.immutable.with("two");
eclipseList.each(Procedures.throwing(appendable::append));
Assert.assertEquals("onetwo", appendable.toString());
26
Eclipse Collectionsの利点
#ccc_gh4
TECHNOLOGY
DIVISION
Eclipse Collectionsにはさらに多くの利点があります。
興味のある方は、JJUG CCC 2015 Springや、JavaOne 2015
の資料や、JavaDoc、ソースコード等をご参照ください。
JJUG CCC 2015 Spring – GS CollectionsとJava 8 - 実用的で流暢なAPIで楽しい開発を!
http://www.goldmansachs.com/gs-collections/presentations/2015-04-11_JJUG_CCC.pdf
JavaOne 2015 – Eclipse Collections by Example
https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/1528/CON10915_2015-1028%20JavaOne%20-%20EclipseCollectionsByExample.pdf
27
#ccc_gh4
TECHNOLOGY
DIVISION
問題を解きながら学ぶ
Eclipse Collections
(ぜひ標準のJava Collections FrameworkやStream APIを使用して解き比べてみてください)
28
問題1
#ccc_gh4
TECHNOLOGY
DIVISION
簡易なショッピングカートを実装したいと思います。アイテムは単純な文字列とし、下記の操作をした後、アイテムの文字列順にカート内
の個数を出力します。
-
操作1:“Item
操作2:“Item
操作3:“Item
操作4:“Item
B”をカートに追加
A”をカートに追加
C”を3個カートに追加
A”をカートに追加
出力例:
“Item Aが2個あります。”
“Item Bが1個あります。”
“Item Cが3個あります。”
どのように実装するか考えてみてください。
29
問題1: SortedBagを使用した実装例
#ccc_gh4
TECHNOLOGY
DIVISION
簡易なショッピングカートを実装したいと思います。アイテムは単純な文字列とし、下記の操作をした後、アイテムの文字列順にカート内
の個数を出力します。
-
操作1:“Item
操作2:“Item
操作3:“Item
操作4:“Item
B”をカートに追加
A”をカートに追加
C”を3個カートに追加
A”をカートに追加
出力例:
“Item Aが2個あります。”
“Item Bが1個あります。”
“Item Cが3個あります。”
どのように実装するか考えてみてください。
// Bagをつかうと要素の出現回数を保持することができ、さらにSortedBag
を使うと要素順にソートすることができます。
MutableSortedBag<String> shoppingCart =
SortedBags.mutable.empty();
shoppingCart.add("Item B");
shoppingCart.add("Item A");
shoppingCart.addOccurrences("Item C", 3);
shoppingCart.add("Item A");
shoppingCart.forEachWithOccurrences(
(item, count)
-> System.out.println(item + "が" + count + "個あります。")
);
30
問題2
#ccc_gh4
TECHNOLOGY
DIVISION
プレゼントをランダムに決める機能を実装したいと思います。下記のような文字列が与えられたとして、
メンバー:"Hiroshi", "Yusuke", "Fumio", "Shotaro", "Tatsuya", "Sumire"
プレゼント:"Smart Phone", "PC", "Video Game", "Guitar", "Robot", "Media Player“
メンバーとプレゼントをそれぞれランダムに対応づけて、下記のような文字列を出力します。
出力例:
ShotaroはSmart Phoneを手に入れました!
SumireはPCを手に入れました!
HiroshiはVideo Gameを手に入れました!
FumioはGuitarを手に入れました!
TatsuyaはRobotを手に入れました!
YusukeはMedia Playerを手に入れました!
どのように実装するか考えてみてください。
31
#ccc_gh4
TECHNOLOGY
問題2: shuffleThis、zipを使用した実装例
DIVISION
プレゼントをランダムに決める機能を実装したいと思います。下記のような文字列が与えられたとして、
メンバー:"Hiroshi", "Yusuke", "Fumio", "Shotaro", "Tatsuya", "Sumire"
プレゼント:"Smart Phone", "PC", "Video Game", "Guitar", "Robot", "Media Player“
メンバーとプレゼントをそれぞれランダムに対応づけて、下記のような文字列を出力します。
出力例:
ShotaroはSmart Phoneを手に入れました!
SumireはPCを手に入れました!
HiroshiはVideo Gameを手に入れました!
FumioはGuitarを手に入れました!
TatsuyaはRobotを手に入れました!
YusukeはMedia Playerを手に入れました!
どのように実装するか考えてみてください。
MutableList<String> names
= Lists.mutable.of("Hiroshi", "Yusuke", "Fumio", "Shotaro", "Tatsuya",
"Sumire");
MutableList<String> presents
= Lists.mutable.of("Smart Phone", "PC", "Video Game", "Guitar", "Robot",
"Media Player");
MutableList<Pair<String, String>> nameAndPresentPairs
= names
.shuffleThis() //順番をランダムに入れ替えます
.zip(presents); //nameとpresentのペアをつくり、リストを返します
System.out.println(
nameAndPresentPairs
.collect(pair -> pair.getOne() + "は" + pair.getTwo())
.makeString("", "を手に入れました! \n", "を手に入れました!"));
32
問題3
#ccc_gh4
TECHNOLOGY
DIVISION
コレクションの分割処理を実装したいと思います。1,000,000要素あるコレクションを、2,000要素ずつ分割処理します。
どのように実装するか考えてみてください。
33
問題3: chunkを使用した実装例
#ccc_gh4
TECHNOLOGY
DIVISION
コレクションの分割処理を実装したいと思います。1,000,000要素あるコレクションを、2,000要素ずつ分割処理します。
どのように実装するか考えてみてください。
LazyIterable<String> elements
= Interval.oneTo(1_000_000).collect(i -> "element" + i);
//[element1, element2, .... element1000000]
LazyIterable<RichIterable<String>> chunk
= elements.chunk(2000); //2000要素ごとに分割
chunk.each(batchedElements -> {
System.out.println("Processing from: "
+ batchedElements.getFirst()
+ " to: "
+ batchedElements.getLast()
+ "\n");
System.out.println("\t---- Do something -----\n");
});
出力:
Processing from: element1 to: element2000
---- Do something ----Processing from: element2001 to: element4000
---- Do something ----…
Processing from: element996001 to: element998000
---- Do something ----Processing from: element998001 to: element1000000
---- Do something -----
34
問題4
#ccc_gh4
TECHNOLOGY
DIVISION
下記のように、2種類の集合があるとします。
バンドメンバー:"Ken", "Irene", "Hiroshi"
Javaコミュニティメンバー:"Fumio", "Sumire", "Yusuke", "Hiroshi“
それぞれの集合から、下記のような文字列の出力を得るプログラムを書きます。
出力例:
バンドとJavaコミュニティ両方に所属: Hiroshi
バンドまたはJavaコミュニティに所属: Fumio, Sumire, Ken, Hiroshi, Irene, Yusuke
バンドのみ所属: Ken, Irene
Javaコミュニティのみ所属: Fumio, Sumire, Yusuke
どのように実装するか考えてみてください。
35
#ccc_gh4
TECHNOLOGY
問題4: SetIterableのAPIを使用した実装例
DIVISION
intersect
下記のように、2種類の集合があるとします。
difference
difference
バンドメンバー:"Ken", "Irene", "Hiroshi"
Javaコミュニティメンバー:"Fumio", "Sumire", "Yusuke", "Hiroshi“
それぞれの集合から、下記のような文字列の出力を得るプログラムを書きます。
出力例:
バンドとJavaコミュニティ両方に所属: Hiroshi
union
バンドまたはJavaコミュニティに所属: Fumio, Sumire, Ken, Hiroshi, Irene, Yusuke
バンドのみ所属: Ken, Irene
MutableSet<String> bandMember = Sets.mutable.of("Ken", "Irene", "Hiroshi");
Javaコミュニティのみ所属: Fumio, Sumire, Yusuke MutableSet<String> javaCommunityMember = Sets.mutable.of("Fumio", "Sumire",
"Yusuke", "Hiroshi");
どのように実装するか考えてみてください。
*スペースの都合上、例には挙げていませんが、
XORをとるsymmetricDifference()もあります。
System.out.println("バンドとJavaコミュニティ両方に所属: "
+ bandMember.intersect(javaCommunityMember).makeString());
System.out.println("バンドまたはJavaコミュニティに所属: "
+ bandMember.union(javaCommunityMember).makeString());
System.out.println("バンドのみ所属: "
+ bandMember.difference(javaCommunityMember).makeString());
System.out.println("Javaコミュニティのみ所属: "
+ javaCommunityMember.difference(bandMember).makeString());
36
問題5:
#ccc_gh4
TECHNOLOGY
DIVISION
下記のような文字列のコレクションから、数字のみ抽出して別の文字列コレクションを作りたいと思います。
["[A12345]", "[A99234]", "[A43156]", "[A55324]“]
出力例
[12345, 99234, 43156, 55324]
どのように実装するか考えてみてください。
37
問題5: CharAdapterを使用した実装例
#ccc_gh4
TECHNOLOGY
DIVISION
下記のような文字列のコレクションから、数字のみ抽出して別の文字列コレクションを作りたいと思います。
["[A12345]", "[A99234]", "[A43156]", "[A55324]“]
出力例
[12345, 99234, 43156, 55324]
どのように実装するか考えてみてください。
// CharAdapterはJava 8で導入されたString.chars()と似た機能です。
// しかし、chars()はIntStreamを返すため、下記のように単純に書くことはできません。
// ぜひ試してみてください。
MutableList<String> strings = Lists.mutable.of("[A12345]", "[A99234]", "[A43156]", "[A55324]");
LazyIterable<String> idList
= strings.asLazy().collect(
string -> CharAdapter.adapt(string)
.select(Character::isDigit)
.makeString(""));
System.out.println(idList);
*バージョン7.0で新しく導入された機能です。
*サロゲートペアに対応したCodePointAdapterもあります。
38
#ccc_gh4
TECHNOLOGY
問題を解きながら学ぶEclipse Collections
DIVISION
Eclipse Collectionsには他にも便利な機能が多数備わっています。
さらにEclipse Collectionsを学んでみたい方は、Kataを解いてみてください。
GS Collections Kata
https://github.com/goldmansachs/gs-collections-kata
- ユニットテストをひとつずつパスしていくTDD型トレーニングマテリアル
- Eclipse Collections/GS Collectionsの使用法を学習するのに最適
- ゴールドマン・サックスの研修にも使用
- Stream APIやラムダ式の学習にも使える
39
#ccc_gh4
TECHNOLOGY
DIVISION
今後のロードマップ
40
Eclipse Collections 今後のロードマップ
#ccc_gh4
TECHNOLOGY
DIVISION
• 今年中にEclipse Collections 7.0リリース
• マイナーアップデート+OSSとしての性質をブラッシュアップ
–
–
–
–
GS Collections KataをEclipse Collections Kataに移行
機能拡張とパフォーマンス改善
ドキュメント、チュートリアルの充実
コントリビューター、コミッターの拡充
• 2016年中に、Eclipse Collections 8.0リリース
• Java 8以前の後方互換を撤廃し、関数インタフェースの互換性を確保
開発に貢献してみたい方はお知らせ下さい!!
開発者メーリングリストの購読: https://dev.eclipse.org/mailman/listinfo/collections-dev
41
Resources
•
#ccc_gh4
TECHNOLOGY
DIVISION
Eclipse Collections Project
https://projects.eclipse.org/proposals/eclipse-collections
•
JavaOne 2015 – Eclipse Collections by Example
https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/1528/CON10915_2015-1028%20JavaOne%20-%20EclipseCollectionsByExample.pdf
•
GS Collections on GitHub
https://github.com/goldmansachs/gs-collections
https://github.com/goldmansachs/gs-collections/wiki
https://github.com/goldmansachs/gs-collections-kata
•
JJUG CCC - GS CollectionsとJava 8 実用的で流暢なAPIで楽しい開発を!
http://www.goldmansachs.com/gs-collections/presentations/2015-04-11_JJUG_CCC.pdf
•
Parallel-lazy Performance: Java 8 vs Scala vs GS Collections
http://www.infoq.com/presentations/java-streams-scala-parallel-collections
Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.
42
#ccc_gh4
TECHNOLOGY
DIVISION
Learn more at GS.com/Engineering
© 2015 Goldman Sachs. This presentation should not be relied upon or considered investment advice. Goldman Sachs does not warrant or guarantee to anyone the accuracy, completeness or efficacy of this
presentation, and recipients should not rely on it except at their own risk. This presentation may not be forwarded or disclosed except with this disclaimer intact.
43