On Github wsh / hold-the-lambdas
sum :: Num a => a -> a -> a sum x y = x + y sum 2 3
def sum(x: Int)(y: Int): Int = { x + y } sum(2)(3)
public int sum(int a, int b){ return a + b; } sum(2, 3);
public static int sumOfSquares(int[] input) { int sum = 0; for(int i: input){ sum += i * i; } return sum; }
def sumOfSquares(xs: Array[Int]): Int = { var sum = 0 for(i <- xs){ sum += i * i } sum }
def sumOfSquares(xs: Array[Int]): Int = { xs.foldLeft(0)((sum, x) => sum + (x * x)) }
sumOfSquares :: Num a => [a] -> a sumOfSquares xs = foldl (\sum x -> sum + (x * x)) 0 xs
def sumOfSquares(xs: Array[Int]): Int = { xs.map(x => x * x).reduceLeft((sum, x) => sum + x) }
sumOfSquares :: Num a => [a] -> a sumOfSquares xs = foldl1 (\sum x -> sum + x) (map (\x -> x * x) xs)
public static int sumSquares(final Integer[] input) { final Collection<Integer> squared = Collections2.transform(Arrays.asList(input), new Function<Integer, Integer>() { public Integer apply(Integer integer) { return integer * integer; } }); int sum = 0; for(int i: squared){ sum += i; } return sum; }
public static int sumSquares(int[] input) { for(int i=0; i<input.length; i++){ input[i] = input[i] * input[i]; } int sum = 0; for(int i: input){ sum += i; } return sum; }
public static int sumSquares(final Collection<Integer> input) { final Collection<Integer> squared = Collections2.transform(input, new Function<Integer, Integer>() { public Integer apply(Integer integer) { return integer * integer; } }); int sum = 0; for(int i: squared){ sum += i; } return sum; }
public static <T> int mapThenSum(final Collection<T> input, final Function<T, Integer> processor) { final Collection<Integer> processed = Collections2.transform(input, processor); int sum = 0; for(int i: processed){ sum += i; } return sum; }
public static <T, U, V> V mapReduce(final Collection<T> input, final Function<T, U> mapper, final Function<V, Function<U, V>> reducer, final V initial) { final Collection<U> mapped = Collections2.transform(input, mapper); V result = initial; for(U value : mapped){ final Function<U, V> toApply = reducer.apply(result); result = toApply.apply(value); } return result; }
mapReduce(Lists.newArrayList(1, 2), new Function<Integer, Integer>() { public Integer apply(final Integer integer) { return integer * integer; } }, new Function<Integer, Function<Integer, Integer>>() { public Function<Integer, Integer> apply(final Integer a) { return new Function<Integer, Integer>() { public Integer apply(final Integer b) { return a + b; } }; }; }, 0));
public static <T, U, V> V mapReduce(final Iterator<T> input, final Function<T, U> mapper, final Function<V, Function<U, V>> reducer, final V initial) { if (!input.hasNext()) { return initial; } else { final V next = reducer.apply(initial).apply(mapper.apply(input.next())); return reduce(input, mapper, reducer, next); } }
mapReduce(Iterators.forArray(1, 2), new Function<Integer, Integer>() { public Integer apply(final Integer integer) { return integer * integer; } }, new Function<Integer, Function<Integer, Integer>>() { public Function<Integer, Integer> apply(final Integer a) { return new Function<Integer, Integer>() { public Integer apply(final Integer b) { return a + b; } }; }; }, 0));
Executors.newSingleThreadExecutor().submit(new Runnable() { public void run() { // ... } });
Collections.sort(collection, new Comparator<T>() { public int compare(T o1, T o2) { // ... } });
Collection<String> presenters = Lists.newArrayList("Gray", "Michael", "Caroline", "Will"); Predicate<String> query = Predicates.or( new Predicate<String>() { public boolean apply(String o) { return o.startsWith("M"); } }, new Predicate<String>() { public boolean apply(String o) { return o.startsWith("C"); } }); Collections2.filter(presenters, query); // { "Michael", "Caroline" }
Collection<String> presenters = Lists.newArrayList("Gray", "Michael", "Caroline", "Will"); final Function<String, String> capitalizeAndReverse = Functions.compose(new Function<String, String>() { public String apply(final String s) { return s.toUpperCase(); } }, new Function<String, String>() { public String apply(final String s) { final char[] chars = s.toCharArray(); for(int i = 0, j = chars.length - 1; i < chars.length / 2; i++, j--) { char temp = chars[i]; chars[i] = chars[j]; chars[j] = temp; } return new String(chars); } } ); Collections2.transform(presenters, capitalizeAndReverse); // { "YARG", "LEAHCIM", "ENILORAC", "LLIW" }
import com.google.common.base.Function; import com.google.common.base.Predicate;
import java.util.function.Function; import java.util.function.Predicate;
final List<String> presenters = Arrays.asList("Gray", "Michael", "Caroline", "Will"); presenters.stream() .filter(s -> s.startsWith("G") || s.startsWith("M")) .forEach(s -> System.out.println(s));
final List<String> presenters = Arrays.asList("Gray", "Michael", "Caroline", "Will"); presenters.stream() .filter(s -> s.startsWith("G") || s.startsWith("M")) .forEach(System.out::println);
final List<String> strings = Arrays.asList("Gray", "Michael", "Caroline", "Will"); strings.stream() .filter(s -> s.startsWith("G") || s.startsWith("M")) .forEach(System.out::println); strings.stream() .allMatch(s -> s.length() > 3); // true strings.stream() .count(); // 4 strings.stream() .map(String::toUpperCase) .collect(Collectors.joining()); // GRAYMICHAELCAROLINEWILL
final List<String> strings = Arrays.asList("Gray", "Michael", "Caroline", "Will"); strings.parallelStream() .filter(s -> s.startsWith("G") || s.startsWith("M")) .forEach(System.out::println); strings.parallelStream() .allMatch(s -> s.length() > 3); // true strings.parallelStream() .count(); // 4 strings.parallelStream() .map(String::toUpperCase) .collect(Collectors.joining()); // GRAYMICHAELCAROLINEWILL
package java.util.function; @FunctionalInterface public interface Function<T, R> { R apply(T t); default <V> Function<V, R> compose(Function<? super V, ? extends T> before) { Objects.requireNonNull(before); return (V v) -> apply(before.apply(v)); } default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) { Objects.requireNonNull(after); return (T t) -> after.apply(apply(t)); } static <T> Function<T, T> identity() { return t -> t; } }excerpt from java/util/function/Function.java
package scala trait Function1[-T1, +R] extends AnyRef { self => def apply(v1: T1): R def compose[A](g: A => T1): A => R = { x => apply(g(x)) } def andThen[A](g: R => A): T1 => A = { x => g(apply(x)) } }excerpt from scala/Function1.scala
scala> val x = List((1,2)).toMap x: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)
scala> x.get(1) res2: Option[Int] = Some(2)
scala> x.get(3) res3: Option[Int] = None
scala> x.getOrElse(4, 5) res4: Option[Int] = 5
Prelude> import qualified Data.Map.Lazy as M Prelude M> let x = M.fromList[(1,2)]
Prelude M> M.lookup 1 x Just 2
Prelude M> M.lookup 3 x Nothing
Prelude M> M.findWithDefault 5 4 x 5
HashMap<Integer, Integer> someHashMap = new HashMap<>(); someHashMap.put(1, 2); Optional<Integer> foo = Optional.fromNullable(someHashMap.get(1)); Optional<Integer> bar = Optional.fromNullable(someHashMap.get(3)); if (foo.isPresent()) foo.get(); // 2 bar.isPresent(); // false bar.get(); // IllegalStateException bar.or(5); // 5
import com.google.common.base.Optional; /* or */ import java.util.Optional;