Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Programação funcional em Java
public class Calculadora {
private static final Prova _ = of(Prova.class);
public double mediaDeProvas(List<Prova> provas) {
return mediaPonderada(provas, function(_.getNota()), function(_.getPeso()));
public <T> double mediaPonderada(List<T> lista, Function<T, Double> valor, Function<T, Double> peso) {
double soma = 0.0;
double somaPesos = 0.0;
for (T t : lista) {
soma += valor.apply(t) * peso.apply(t);
somaPesos += peso.apply(t);
return soma/somaPesos;
private <T> Function<Prova, T> function(T ignore) {
return Funcional.function(ignore);
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;
import net.vidageek.mirror.dsl.Mirror;
public class Funcional {
private static final ThreadLocal<Method> _method = new ThreadLocal<Method>();
private static final ThreadLocal<Object[]> _args = new ThreadLocal<Object[]>();
public static <F,T> Function<F, T> function(T value) {
final Method method = _method.get();
final Object[] args = _args.get();
return new Function<F, T>() {
public T apply(F f) {
return (T) new Mirror().on(f).invoke().method(method).withArgs(args);
public static <T> T of(Class<T> type) {
return new ObjenesisProxifier().proxify(type, new MethodInvocation<T>() {
public Object intercept(T proxy, Method metodo, Object[] args, SuperMethod superMethod) {
return null;
public class Prova {
private double nota;
private double peso;
public Prova(double nota, double peso) {
this.nota = nota;
this.peso = peso;
public double getNota() {
return nota;
public double getPeso() {
return peso;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment