Java 1,7. реализация функции - PullRequest
       96

Java 1,7. реализация функции

0 голосов
/ 04 августа 2020

Я использую Java 1.7. (старый я знаю, но я работаю над устаревшим приложением с множеством зависимостей).

Я хотел бы реализовать интерфейс java.util.function.Function в версии 1.7.

У меня есть следующее, поэтому далеко, но все еще получаю ошибки компиляции:

public interface Function<T, R> {
    R apply(T t);

    public static <T, V, R> Function<V, R> compose(Function<? super V, ? extends T> before, Function<? super T, ? super R> after) {
        return new CombiningFunction<T, V, R>(before, after);
    }

    public static <T, R, V> Function<T, V> andThen(Function<? super T, ? super R> before, Function<? super R, ? extends V> after) {
        return new CombiningFunction<T, V, R>(before, after);
    }

    static <T> Function<T, T> identity() {
        return new Function<T, T> {
            T apply(T t) { return t; }
        }
    }
}

class CombiningFunction<T, V, R> implements Function<T, R> {
    Function<T, V> first;
    Function<V, R> second;

    public R apply(T t) {
        V intermediate = first.apply(t);
        return second.apply(intermediate);
    }
}

Мне нужно добавить конструктор в CombiningFunction, но я не уверен, как его добавить, поскольку я пробовал следующее:

 public <V, T, R> CombiningFunction(Function<? super V,? extends T> before, Function<? super T,? super R> after) {     }

, но при доступе к конструктору я получаю больше ошибок компиляции для типов.

Кроме того, следующие ошибки содержат:

    return new Function<T, T> {
        T apply(T t) { return t; }
    }

Любая помощь с этим Function интерфейсом были бы признательны.

Ошибки компиляции:

return new CombiningFunction<T, V, R>(before, after);

Ожидается 0 аргументов, но найдено 2

return new CombiningFunction<T, V, R>(before, after);

Ожидается 0 аргументов, но найдено 2

static <T> Function<T, T> identity() {
    return new Function<T, T> {
        T apply(T t) { return t; }
    }
}

'(' или '[' ожидалось ';' ожидалось Невозможно разрешить символ 't' Неожиданный токен

Я хотел бы использовать Function следующим образом:

/**
 * Creates Jwt token and other util methods.
 */
public class JwtTokenUtil {

    private String SECRET_KEY = "secret-876123";

    public String extractUserName(String token) {
        return extractClaim(token, new Function<Claims, String>() {
            @Override
            public String apply(Claims claims) {
                return claims.getSubject();
            }
        });
    }

    public Date extractExpiration(String token) {
        return extractClaim(token, new Function<Claims, Date>() {
            @Override
            public Date apply(Claims claims) {
                return claims.getExpiration();
            }
        });
    }

    public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
        final Claims claims = extractAllClaims(token);
        return claimsResolver.apply(claims);
    }

    private Claims extractAllClaims(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
    }

    private Boolean isTokenExpired(String token) {
        return extractExpiration(token).before(new Date());
    }

    /**
     * Pass in user details, and get a Jwt
     * @param userDetails
     * @return
     */
    public String generateToken(UserDetails userDetails) {
        Map<String,Object> claims = new HashMap<>();
        return createToken(claims, userDetails.getUsername());
    }

    private String createToken(Map<String,Object> claims, String subject) {
        return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 10 hrs
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();
    }

    public Boolean validteToken(String token, UserDetails userDetails) {
        final String username = extractUserName(token);
        return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
    }
}

1 Ответ

0 голосов
/ 04 августа 2020

Если вы go используете репозиторий OpenJDK, вы можете найти источник класса Function. Я не в курсе доступных функций и классов в Java 7, но я думаю, что это должно исправить некоторые из ваших проблем с Generics

https://github.com/openjdk/jdk/blob/6bab0f539fba8fb441697846347597b4a0ade428/src/java.base/share/classes/java/util/function/Function.java

...