/* package whatever; // don't place package name! */
// Use an instance method reference with different objects.
// A functional interface that takes two reference arguments
// and returns a boolean result.
interface MyFunc<T> {
boolean func(T v1, T v2);
}
// A class that stores the temperature high for a day.
class HighTemp {
private int hTemp;
HighTemp(int ht) { hTemp = ht; }
// Return true if the invoking HighTemp object has the same
// temperature as ht2.
boolean sameTemp(HighTemp ht2) {
return hTemp == ht2.hTemp;
}
// Return true if the invoking HighTemp object has a temperature
// that is less than ht2.
boolean lessThanTemp(HighTemp ht2) {
return hTemp < ht2.hTemp;
}
}
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
// A method that returns the number of occurences
// of an object for which some criteria, as specified by
// the MyFunc parameter, is true.
static <T> int counter(T[] vals, MyFunc<T> f, T v) {
int count = 0;
for(int i=0; i < vals.length; i++)
if(f.func(vals[i], v)) count++;
return count;
}
{
int count;
// Create an array of HighTemp objects.
HighTemp[] weekDayHighs = { new HighTemp(89), new HighTemp(82),
new HighTemp(90), new HighTemp(89),
new HighTemp(89), new HighTemp(91),
new HighTemp(84), new HighTemp(83) };
// Use counter() with arrays of the class HighTemp.
// Notice that a reference to the instance method
// sameTemp() is passed as the second argument.
count = counter(weekDayHighs, HighTemp::sameTemp,
new HighTemp(89));
System.
out.
println(count
+ " days had a high of 89");
// Now, create and use another array of HighTemp objects.
HighTemp[] weekDayHighs2 = { new HighTemp(32), new HighTemp(12),
new HighTemp(24), new HighTemp(19),
new HighTemp(18), new HighTemp(12),
new HighTemp(-1), new HighTemp(13) };
count = counter(weekDayHighs2, HighTemp::sameTemp,
new HighTemp(12));
System.
out.
println(count
+ " days had a high of 12");
// Now, use lessThanTemp() to find days when temperature was less
// that a specified value.
count = counter(weekDayHighs, HighTemp::lessThanTemp,
new HighTemp(89));
System.
out.
println(count
+ " days had a high less than 89");
count = counter(weekDayHighs2, HighTemp::lessThanTemp,
new HighTemp(19));
System.
out.
println(count
+ " days had a high of less than 19"); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKLy8gVXNlIGFuIGluc3RhbmNlIG1ldGhvZCByZWZlcmVuY2Ugd2l0aCBkaWZmZXJlbnQgb2JqZWN0cy4gCiAKLy8gQSBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHRha2VzIHR3byByZWZlcmVuY2UgYXJndW1lbnRzIAovLyBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0LiAKaW50ZXJmYWNlIE15RnVuYzxUPiB7IAogIGJvb2xlYW4gZnVuYyhUIHYxLCBUIHYyKTsgCn0gCiAKLy8gQSBjbGFzcyB0aGF0IHN0b3JlcyB0aGUgdGVtcGVyYXR1cmUgaGlnaCBmb3IgYSBkYXkuIApjbGFzcyBIaWdoVGVtcCB7IAogIHByaXZhdGUgaW50IGhUZW1wOyAKIAogIEhpZ2hUZW1wKGludCBodCkgeyBoVGVtcCA9IGh0OyB9IAogCiAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGludm9raW5nIEhpZ2hUZW1wIG9iamVjdCBoYXMgdGhlIHNhbWUgCiAgLy8gdGVtcGVyYXR1cmUgYXMgaHQyLiAKICBib29sZWFuIHNhbWVUZW1wKEhpZ2hUZW1wIGh0MikgeyAKICAgIHJldHVybiBoVGVtcCA9PSBodDIuaFRlbXA7IAogIH0gCiAKICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW52b2tpbmcgSGlnaFRlbXAgb2JqZWN0IGhhcyBhIHRlbXBlcmF0dXJlIAogIC8vIHRoYXQgaXMgbGVzcyB0aGFuIGh0Mi4gCiAgYm9vbGVhbiBsZXNzVGhhblRlbXAoSGlnaFRlbXAgaHQyKSB7IAogICAgcmV0dXJuIGhUZW1wIDwgaHQyLmhUZW1wOyAKICB9IAp9IAoKCi8qIE5hbWUgb2YgdGhlIGNsYXNzIGhhcyB0byBiZSAiTWFpbiIgb25seSBpZiB0aGUgY2xhc3MgaXMgcHVibGljLiAqLwpjbGFzcyBJZGVvbmUKewoJIC8vIEEgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG9jY3VyZW5jZXMgCiAgLy8gb2YgYW4gb2JqZWN0IGZvciB3aGljaCBzb21lIGNyaXRlcmlhLCBhcyBzcGVjaWZpZWQgYnkgCiAgLy8gdGhlIE15RnVuYyBwYXJhbWV0ZXIsIGlzIHRydWUuIAogIHN0YXRpYyA8VD4gaW50IGNvdW50ZXIoVFtdIHZhbHMsIE15RnVuYzxUPiBmLCBUIHYpIHsgCiAgICBpbnQgY291bnQgPSAwOyAKIAogICAgZm9yKGludCBpPTA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSAKICAgICAgaWYoZi5mdW5jKHZhbHNbaV0sIHYpKSBjb3VudCsrOyAKIAogICAgcmV0dXJuIGNvdW50OyAgIAogIH0gCgkKCQoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCSAgeyAKICAgIGludCBjb3VudDsgCiAKICAgIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBIaWdoVGVtcCBvYmplY3RzLiAKICAgIEhpZ2hUZW1wW10gd2Vla0RheUhpZ2hzID0geyBuZXcgSGlnaFRlbXAoODkpLCBuZXcgSGlnaFRlbXAoODIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGlnaFRlbXAoOTApLCBuZXcgSGlnaFRlbXAoODkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGlnaFRlbXAoODkpLCBuZXcgSGlnaFRlbXAoOTEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGlnaFRlbXAoODQpLCBuZXcgSGlnaFRlbXAoODMpIH07IAogCiAgICAvLyBVc2UgY291bnRlcigpIHdpdGggYXJyYXlzIG9mIHRoZSBjbGFzcyBIaWdoVGVtcC4gCiAgICAvLyBOb3RpY2UgdGhhdCBhIHJlZmVyZW5jZSB0byB0aGUgaW5zdGFuY2UgbWV0aG9kIAogICAgLy8gc2FtZVRlbXAoKSBpcyBwYXNzZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gCiAgICBjb3VudCA9IGNvdW50ZXIod2Vla0RheUhpZ2hzLCBIaWdoVGVtcDo6c2FtZVRlbXAsIAogICAgICAgICAgICAgICAgICBuZXcgSGlnaFRlbXAoODkpKTsgCiAgICBTeXN0ZW0ub3V0LnByaW50bG4oY291bnQgKyAiIGRheXMgaGFkIGEgaGlnaCBvZiA4OSIpOyAKIAogICAgLy8gTm93LCBjcmVhdGUgYW5kIHVzZSBhbm90aGVyIGFycmF5IG9mIEhpZ2hUZW1wIG9iamVjdHMuIAogICAgSGlnaFRlbXBbXSB3ZWVrRGF5SGlnaHMyID0geyBuZXcgSGlnaFRlbXAoMzIpLCBuZXcgSGlnaFRlbXAoMTIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGlnaFRlbXAoMjQpLCBuZXcgSGlnaFRlbXAoMTkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGlnaFRlbXAoMTgpLCBuZXcgSGlnaFRlbXAoMTIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGlnaFRlbXAoLTEpLCBuZXcgSGlnaFRlbXAoMTMpIH07IAogCiAgICBjb3VudCA9IGNvdW50ZXIod2Vla0RheUhpZ2hzMiwgSGlnaFRlbXA6OnNhbWVUZW1wLCAKICAgICAgICAgICAgICAgICAgICBuZXcgSGlnaFRlbXAoMTIpKTsgCiAgICBTeXN0ZW0ub3V0LnByaW50bG4oY291bnQgKyAiIGRheXMgaGFkIGEgaGlnaCBvZiAxMiIpOyAKIAogCiAgICAvLyBOb3csIHVzZSBsZXNzVGhhblRlbXAoKSB0byBmaW5kIGRheXMgd2hlbiB0ZW1wZXJhdHVyZSB3YXMgbGVzcyAKICAgIC8vIHRoYXQgYSBzcGVjaWZpZWQgdmFsdWUuIAogICAgY291bnQgPSBjb3VudGVyKHdlZWtEYXlIaWdocywgSGlnaFRlbXA6Omxlc3NUaGFuVGVtcCwgCiAgICAgICAgICAgICAgICAgICAgbmV3IEhpZ2hUZW1wKDg5KSk7IAogICAgU3lzdGVtLm91dC5wcmludGxuKGNvdW50ICsgIiBkYXlzIGhhZCBhIGhpZ2ggbGVzcyB0aGFuIDg5Iik7IAogCiAgICBjb3VudCA9IGNvdW50ZXIod2Vla0RheUhpZ2hzMiwgSGlnaFRlbXA6Omxlc3NUaGFuVGVtcCwgCiAgICAgICAgICAgICAgICAgICAgbmV3IEhpZ2hUZW1wKDE5KSk7IAogICAgU3lzdGVtLm91dC5wcmludGxuKGNvdW50ICsgIiBkYXlzIGhhZCBhIGhpZ2ggb2YgbGVzcyB0aGFuIDE5Iik7IAogIH0gCn0=