/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
class Tuple<A, B> {
private final A fst;
private final B snd;
public Tuple(A fst, B snd) {
this.fst = fst;
this.snd = snd;
}
public A fst() {
return fst;
}
public B snd() {
return snd;
}
return String.
format("(%s,%s)", fst, snd
); }
}
interface Function<A, B> {
B apply(A x);
}
class IntStr
implements Function
<Integer, String
> { return x.toString();
}
}
class MakeTpl<A> implements Function<A, Tuple<A, A>> {
public Tuple<A, A> apply(A x) {
return new Tuple(x, x);
}
}
class Ideone {
public static <A, B> List<B> transform(Function<A, B> f, List<A> xs) {
List<B> ys = new ArrayList<>(xs.size());
for (A x : xs) {
ys.add(f.apply(x));
}
return ys;
}
static <A, B> void test(Function<A, B> f, List<A> xs) {
System.
out.
println(transform
(f, xs
)); }
static class MakeChrTpl extends MakeTpl<Character> {}
List
<Integer
> xs
= Arrays.
asList(1,
2,
3); List
<Character
> ys
= Arrays.
asList('a',
'b',
'c'); test(new IntStr(), xs);
test(new MakeChrTpl(), ys);
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBUdXBsZTxBLCBCPiB7Cglwcml2YXRlIGZpbmFsIEEgZnN0OwoJcHJpdmF0ZSBmaW5hbCBCIHNuZDsKCXB1YmxpYyBUdXBsZShBIGZzdCwgQiBzbmQpIHsKCQl0aGlzLmZzdCA9IGZzdDsKCQl0aGlzLnNuZCA9IHNuZDsKCX0KCXB1YmxpYyBBIGZzdCgpIHsKCQlyZXR1cm4gZnN0OwoJfQoJcHVibGljIEIgc25kKCkgewoJCXJldHVybiBzbmQ7Cgl9CglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCXJldHVybiBTdHJpbmcuZm9ybWF0KCIoJXMsJXMpIiwgZnN0LCBzbmQpOwoJfQp9CgppbnRlcmZhY2UgRnVuY3Rpb248QSwgQj4gewoJQiBhcHBseShBIHgpOwp9CgpjbGFzcyBJbnRTdHIgaW1wbGVtZW50cyBGdW5jdGlvbjxJbnRlZ2VyLCBTdHJpbmc+IHsKCXB1YmxpYyBTdHJpbmcgYXBwbHkoSW50ZWdlciB4KSB7CgkJcmV0dXJuIHgudG9TdHJpbmcoKTsKCX0KfQoKY2xhc3MgTWFrZVRwbDxBPiBpbXBsZW1lbnRzIEZ1bmN0aW9uPEEsIFR1cGxlPEEsIEE+PiB7CglwdWJsaWMgVHVwbGU8QSwgQT4gYXBwbHkoQSB4KSB7CgkJcmV0dXJuIG5ldyBUdXBsZSh4LCB4KTsKCX0KfQoKY2xhc3MgSWRlb25lIHsKCXB1YmxpYyBzdGF0aWMgPEEsIEI+IExpc3Q8Qj4gdHJhbnNmb3JtKEZ1bmN0aW9uPEEsIEI+IGYsIExpc3Q8QT4geHMpIHsKCQlMaXN0PEI+IHlzID0gbmV3IEFycmF5TGlzdDw+KHhzLnNpemUoKSk7CgkJZm9yIChBIHggOiB4cykgewoJCQl5cy5hZGQoZi5hcHBseSh4KSk7CgkJfQoJCXJldHVybiB5czsKCX0KCQoJc3RhdGljIDxBLCBCPiB2b2lkIHRlc3QoRnVuY3Rpb248QSwgQj4gZiwgTGlzdDxBPiB4cykgewoJCVN5c3RlbS5vdXQucHJpbnRsbih0cmFuc2Zvcm0oZiwgeHMpKTsKCX0KCXN0YXRpYyBjbGFzcyBNYWtlQ2hyVHBsIGV4dGVuZHMgTWFrZVRwbDxDaGFyYWN0ZXI+IHt9CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewoJCUxpc3Q8SW50ZWdlcj4geHMgPSBBcnJheXMuYXNMaXN0KDEsIDIsIDMpOwoJCUxpc3Q8Q2hhcmFjdGVyPiB5cyA9IEFycmF5cy5hc0xpc3QoJ2EnLCAnYicsICdjJyk7CgkJdGVzdChuZXcgSW50U3RyKCksIHhzKTsKCQl0ZXN0KG5ldyBNYWtlQ2hyVHBsKCksIHlzKTsKCX0KfQ==