2009年9月27日日曜日

JavaでLINQ03

昨日のHokuriku.Scala 第一回 : ATNDでだいぶ読み替え慣れてきた。一通りメソッドを用意。
PLINQ → Java のポーティングと、PLINQ → Scala のポーティングはどう考えても後者のほうが楽そう。
Scala で書いてコンパイルしたクラスを GAE に送り込んで、もし動けばこのシリーズはとりあえず終われるかな?

メイン:

import java.util.List;

public class Main {

public static void main(String[] args) throws InterruptedException {

System.out.println("map Result: ");
for (Integer i : Enumerable.range(1, 3)
.map(
new Func1<Integer, Integer>(){
public Integer _(Integer i) {
return i * 2;
}
}
)) {
System.out.println(i);
}
// map Result:
// 2
// 4
// 6


System.out.println("filter Result: ");
for (Integer i : Enumerable.range(1, 4)
.filter(
new Func1<Integer, Boolean>() {
public Boolean _(Integer i) {
return i % 2 == 0;
}
}
)) {
System.out.println(i);
}
// filter Result:
// 2
// 4


System.out.println("takeWhile Result: ");
for (Integer i : Enumerable.range(1, 5)
.takeWhile(
new Func1<Integer, Boolean>() {
public Boolean _(Integer i) {
return i <= 3;
}
}
)) {
System.out.println(i);
}
// takeWhile Result:
// 1
// 2
// 3


System.out.println("foldLeft Result: ");
Integer result = Enumerable.range(1, 10)
.foldLeft(0)
._(
new Func2<Integer, Integer, Integer>(){
public Integer _(Integer sum, Integer a) {
return sum + a;
}
}
);
System.out.println(result);
// foldLeft Result:
// 55


System.out.println("fibs Result: ");
for (Integer i : fibs().take(10)) {
System.out.println(i);
}
// fibs Result:
// 0
// 1
// 1
// 2
// 3
// 5
// 8
// 13
// 21
// 34
}

private static Enumerable<Integer> fibs() {

final Enumerable<Integer> initialValues =
Enumerable.yield(
0,
1
);

final Enumerable<Integer> fibsEnumeralbe =
new Enumerable<Integer>(
new Func0<Iterable<Integer>>() {
public Iterable<Integer> _() {
return fibs();
}
}
);

return initialValues.concat(
Enumerable.zip(
new Func0<Iterable<Integer>> () {
public Iterable<Integer> _() {
return fibsEnumeralbe;
}
},
new Func0<Iterable<Integer>> () {
public Iterable<Integer> _() {
return fibsEnumeralbe.skip(1);
}
}
)
.select(
new Func1<List<Integer>, Integer> () {
public Integer _(List<Integer> arg0) {
return arg0.get(0) + arg0.get(1);
}
}
)
);
}
}




関数オブジェクトの替わりのインターフェース達:

public interface Func0<TResult> {
TResult _();
}

public interface Func1<T, TResult> {
TResult _(final T arg0);
}

public interface Func2<T0, T1, TResult> {
TResult _(final T0 arg0, final T1 arg1);
}


Adaptor クラス:

import java.util.Iterator;


public class IteratorAdaptor<T> implements Iterator<T> {

@Override
public boolean hasNext() {
return false;
}

@Override
public T next() {
return null;
}

@Override
public void remove() {
}

public Iterable<T> asIterable() {
final IteratorAdaptor<T> _this = this;
return new Iterable<T>() {
@Override
public Iterator<T> iterator() {
return _this;
}
};
}

}


Enumerable クラス(これが本体):

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


public class Enumerable<T> implements Iterable<T> {

private Func0<Iterable<T>> func;

public Enumerable(Func0<Iterable<T>> func) {
this.func = func;
}

public <TResult> Enumerable<TResult> select(final Func1<T, TResult> func) {

final Enumerable<T> _this = this;

final class IteratorImpl extends IteratorAdaptor<TResult> {

private Iterator<T> iterator;

@Override
public boolean hasNext() {
if (iterator == null) {
iterator = _this.func._().iterator();
}
return iterator.hasNext();
}

@Override
public TResult next() {
return func._(iterator.next());
}

}

return new Enumerable<TResult>(
new Func0<Iterable<TResult>>() {
public Iterable<TResult> _() { return new IteratorImpl().asIterable(); }
}
);
}

public <TResult> Enumerable<TResult> map(final Func1<T, TResult> func) {
return select(func);
}

public <TResult> Enumerable<TResult> selectMany(final Func1<T, Enumerable<TResult>> selector) {

final Enumerable<T> _this = this;

final class IteratorImpl extends IteratorAdaptor<TResult> {

private Iterator<T> iterator;
private Iterator<TResult> selectorIterator;

@Override
public boolean hasNext() {
if (iterator == null) {
iterator = _this.func._().iterator();
}
boolean hasNext;
if (selectorIterator == null) {
hasNext = iterator.hasNext();
if (hasNext) {
selectorIterator = selector._(iterator.next()).iterator();
hasNext = selectorIterator.hasNext();
}
else {
// 列挙終了。
}
}
else {
hasNext = selectorIterator.hasNext();
if (!hasNext) {
selectorIterator = null;
hasNext = hasNext();
}
}

return hasNext;
}

@Override
public TResult next() {
return selectorIterator == null ? null : selectorIterator.next();
}

}

return new Enumerable<TResult>(
new Func0<Iterable<TResult>>() {
public Iterable<TResult> _() { return new IteratorImpl().asIterable(); }
}
);
}

public Enumerable<T> where(final Func1<T, Boolean> predicate) {

final Enumerable<T> _this = this;

final class IteratorImpl extends IteratorAdaptor<T> {

private Iterator<T> iterator;

@Override
public boolean hasNext() {
if (iterator == null) {
iterator = _this.func._().iterator();
}
boolean hasNext;
while ((hasNext = iterator.hasNext())) {
if (predicate._(iterator.next())) {
break;
}
}
return hasNext;
}

@Override
public T next() {
return iterator.next();
}

}

return new Enumerable<T>(
new Func0<Iterable<T>>() {
public Iterable<T> _() { return new IteratorImpl().asIterable(); }
}
);
}

public Enumerable<T> filter(final Func1<T, Boolean> predicate) {
return where(predicate);
}

public Enumerable<T> take(final int count) {

final Enumerable<T> _this = this;

final class IteratorImpl extends IteratorAdaptor<T> {

private int index;
private Iterator<T> iterator;

@Override
public boolean hasNext() {
if (iterator == null) {
iterator = _this.func._().iterator();
}
return index++ < count ? iterator.hasNext() : false;
}

@Override
public T next() {
return iterator.next();
}

}

return new Enumerable<T>(
new Func0<Iterable<T>>() {
public Iterable<T> _() { return new IteratorImpl().asIterable(); }
}
);
}

public Enumerable<T> takeWhile(final Func1<T, Boolean> predicate) {

final Enumerable<T> _this = this;

final class IteratorImpl extends IteratorAdaptor<T> {

private Iterator<T> iterator;

@Override
public boolean hasNext() {
if (iterator == null) {
iterator = _this.func._().iterator();
}
boolean hasNext = iterator.hasNext();
return hasNext && predicate._(iterator.next());
}

@Override
public T next() {
return iterator.next();
}

}

return new Enumerable<T>(
new Func0<Iterable<T>>() {
public Iterable<T> _() { return new IteratorImpl().asIterable(); }
}
);
}

public Enumerable<T> skip(final int count) {

final Enumerable<T> _this = this;

final class IteratorImpl extends IteratorAdaptor<T> {

private Iterator<T> iterator;

@Override
public boolean hasNext() {
if (iterator == null) {
iterator = _this.func._().iterator();
for (int counter = 0; counter < count && iterator.hasNext(); counter++);
}
return iterator.hasNext();
}

@Override
public T next() {
return iterator.next();
}
}

return new Enumerable<T>(
new Func0<Iterable<T>>() {
public Iterable<T> _() { return new IteratorImpl().asIterable(); }
}
);
}

public Enumerable<T> concat(final Enumerable<T> enumerable) {

final Enumerable<T> _this = this;

final class IteratorImpl extends IteratorAdaptor<T> {

private Iterator<T> iterator;
private boolean nextIteratorInitialized;

@Override
public boolean hasNext() {
if (iterator == null) {
iterator = _this.func._().iterator();
}
boolean hasNext = iterator.hasNext();
if (!hasNext && !nextIteratorInitialized) {
iterator = enumerable.iterator();
nextIteratorInitialized = true;
hasNext = iterator.hasNext();
}
return hasNext;
}

@Override
public T next() {
return iterator.next();
}
}


return new Enumerable<T>(
new Func0<Iterable<T>>() {
public Iterable<T> _() { return new IteratorImpl().asIterable(); }
}
);
}

public Func1<Func2<T, T, T>, T> foldLeft(final T initialValue) {

final Enumerable<T> _this = this;

return new Func1<Func2<T, T, T>, T>() {
@Override
public T _(Func2<T, T, T> arg0) {
T lastValue = initialValue;

for (T current : _this.func._()) {
lastValue = arg0._(lastValue, current);
}

return lastValue;
}
};
}


@Override
public Iterator<T> iterator() {
return this.func._().iterator();
}

public static <T> Enumerable<T> iterate(final T initialValue, final Func1<T, T> func) {

final class IteratorImpl extends IteratorAdaptor<T> {

private boolean initialized;
private T next;

@Override
public boolean hasNext() {
if (!initialized) {
next = initialValue;
initialized = true;
}
else {
next = func._(next);
}
return true;
}

@Override
public T next() {
return next;
}

}

return new Enumerable<T>(
new Func0<Iterable<T>>() {
public Iterable<T> _() { return new IteratorImpl().asIterable(); }
}
);
}

public static Enumerable<Integer> range(final int start, final int count) {
return iterate(
start,
new Func1<Integer, Integer> () {
public Integer _(Integer arg0) {
return arg0 + 1;
}
}
)
.take(count);
}

public static <T> Enumerable<List<T>> zip(final Func0<Iterable<T>> func1, final Func0<Iterable<T>> func2) {

final class IteratorImpl extends IteratorAdaptor<List<T>> {

private Iterator<T> iterator1;
private Iterator<T> iterator2;

@Override
public boolean hasNext() {
if (iterator1 == null) {
iterator1 = func1._().iterator();
}
if (iterator2 == null) {
iterator2 = func2._().iterator();
}
boolean hasNext1 = iterator1.hasNext();
boolean hasNext2 = iterator2.hasNext();
return hasNext1 || hasNext2;
}

@Override
public List<T> next() {
List<T> tuple = new ArrayList<T>();
tuple.add(iterator1.next());
tuple.add(iterator2.next());
return tuple;
}
}

return new Enumerable<List<T>>(
new Func0<Iterable<List<T>>>() {
public Iterable<List<T>> _() { return new IteratorImpl().asIterable(); }
}
);
}

public static <T> Enumerable<T> yield(final Object ... objects) {

final class IteratorImpl extends IteratorAdaptor<T> {

private int index = -1;

@Override
public boolean hasNext() {
if (++index < objects.length) {
return true;
}
else {
return false;
}
}

@SuppressWarnings("unchecked")
@Override
public T next() {
if (objects[index] instanceof Func0) {
return (T)((Func0)objects[index])._();
}
else {
return (T)objects[index];
}
}

}

return new Enumerable<T>(
new Func0<Iterable<T>>() {
public Iterable<T> _() { return new IteratorImpl().asIterable(); }
}
);
}

public static <T> Enumerable<T> yieldWhile(final Func0<T> func) {
return yieldWhile(
func,
new Func1<T, Boolean>() {
public Boolean _(T arg0) {
return true;
}
}
);
}

public static <T> Enumerable<T> yieldWhile(final Func0<T> func, final Func1<T, Boolean> predicate) {
return iterate(
func._(),
new Func1<T, T>(){
public T _(T arg0) {
return func._();
}
}
)
.where(predicate);
}
}

0 件のコメント:

コメントを投稿