C#のLINQをKotlinに移植したもの。KotlinでLINQ使いたい人向け(まだまだ改良の余地はあるけど

使用方法

gradle

dependencies {
    compile 'net.meilcli:klinq:1.5'
}

使い方

KLinqを使用するには以下のインポート文が必要です

import net.meilcli.klinq.*

またKLinq実装のIEnumerableを取り出すのにtoEnumerableなどの拡張関数を以下のように呼び出す必要があります

arrayOf(1,2).toEnumerable().where{ x -> x%2==0 }.toList()

IEnumerableを取り出す拡張関数は以下のものが定義されてます

クラス 拡張関数 返り値
Iterable<TSource> toEnumerable IEnumerable<TSource>
Sequence<TSource> toEnumerable IEnumerable<TSource>
IEnumerable<TSource> asEnumerable IEnumerable<TSource>
Array<TSource> toEnumerable IEnumerable<TSource>
BooleanArray toEnumerable IEnumerable<Boolean>
CharArray toEnumerable IEnumerable<Char>
ByteArray toEnumerable IEnumerable<Byte>
ShortArray toEnumerable IEnumerable<Short>
IntArray toEnumerable IEnumerable<Int>
LongArray toEnumerable IEnumerable<Long>
FloatArray toEnumerable IEnumerable<Float>
DoubleArray toEnumerable IEnumerable<Double>

また特殊な用法として以下のような書き方も可能です

(1..2).toEnumerable().where{ x -> x%2==0 }.toList()

その他の拡張関数においてはなるべくC#における実装に近づけたためC#のドキュメントが参考になります

C#における実装との差異

  • stdlibの拡張関数と関数名が被るためtoEnumeable拡張関数を呼び出す必要があります
  • リフレクションを用いずにジェネリクスの規定値を得ることができないため以下の拡張関数においては規定値はnullになります
    • elementAtOrDefault
    • firstOrDefault
    • lastOrDefault
    • singleOrDefault
  • ジェネリクスの型解決がうまくいかないため宣言が変更されているものがあります
    • fun <TSource : Number> IEnumerable<TSource>.average() : Double
    • fun <TSource : Number> IEnumerable<TSource>.sum() : Double
  • 以下の拡張関数において型を明示した場合に差異が生じる可能性があります
    • inline fun <TSource, reified TResult> IEnumerable<TSource>.ofType(): IEnumerable<TResult>
    • inline fun <TSource, reified TResult> IEnumerable<TSource>.cast(): IEnumerable<TResult>

Sequenceとの連携

Kotlin標準ライブラリにおける遅延実行リスト操作関数との連携のために以下のものが定義されています

クラス 拡張関数 返り値
Sequence<TSource> toEnumerable IEnumerable<TSource>
IEnumerable<TSource> asSequence Sequence<TSource>

その他の拡張関数

利用率の高いforeach拡張関数が定義されてます

fun <TSource> IEnumerable<TSource>.forEach(action: (TSource) -> Unit)
fun <TSource> IEnumerable<TSource>.forEach(action: (TSource, Int) -> Unit)

ライセンス

このライブラリはThe MIT Licenseで公開しています

Apache License, Version 2.0The Kotlin Standard Libraryを使用しています