提供一系列地图调用,一般性问题的说明

时间:2016-02-04 17:06:06

标签: java generics java-8 java-stream

我要编写的代码

,基本上看起来这个Persistable是Spring Data中的一个接口getIdisNew

    Optional<Pair<Persistable<Long>, <Persistable<Long>>> pair = Optional.of( Pair.of( prev, next ) );
    return Long.instructions()
        .map( instruction -> {
            return pair.map( extractPair( instruction.extractProperty() ) )
                .map( instruction.pairToBuilder() )
                .filter( Optional::isPresent )
        } );

有时我想将“Long”转换为String,其他时候转换为Integer。这是从复杂对象中减少的假设。

我想将我的指令存储在Enum中,指令界面目前看起来像这样。

interface Instruction<IN, OUT, BUILDER> {

<INPUT> Function<Pair<INPUT, INPUT>, Optional<BUILDER>> pairToBuilder()

Function<IN, OUT> extractProperty();

}

所以目前这些位编译问题来自于处理指令的实际实现

public class PeristableInstruction<OUT> implements Instruction<Persistable<Long>, OUT, String>

private final Function<Persitable<Long>, OUT> extractProperty;
private Function<Pair<OUT, OUT>, Optional<String>> pairOptionalFunction;


@Override
public <INPUT> Function<Pair<INPUT, INPUT>, Optional<String>> pairToBuilder() {
    return this.pairOptionalFunction;
}

@Override
public Function<Persistable<Long>, OUT> extractProperty()
{
    return extractProperty;
}

此处extractPair Pair的实施只是org.apache.commons.lang3.tuple.Pair

static <OUT, IN> Function<Pair<IN, IN>, Pair<OUT, OUT>> extractPair( final Function<IN, OUT> extract ) {
    return pair -> Pair.of( extract.apply( pair.getLeft() ), extract.apply( pair.getRight() ) );
}

问题当然是INPUT不是OUT但它应该是,但是如果我将签名更改为不使用INPUT .map则不喜欢它,我想不出基于此的方法来做到这一点。

更新虽然无关紧要,因为问题似乎是如何指定一个指令字段以使其一般正确,这里是指令源,其中包含一些 ished 代码

SPECIFIC_INSTRUCTION( new PersistableInstructio<>( Persistable::Long, Long::toString, Builder::new ) );


private final Optional<PersistableInstruction<?>> instruction;

PersistableInstructions( final PersitableInstruction<?> instruction )
{
    this.instruction = Optional.ofNullable( instruction );
}

public static Stream<PersistableInstruction<?>> instructions() {
    return Stream.of( PersistableInstructions.values() )
        .map( PersistableInstructions::getInstruction )
        .filter( Optional::isPresent )
        .map( Optional::get );
}

public Optional<PersistableInstruction<?>> getInstruction()
{
    return instruction;
}

通用意图是提供可以提供给Optional或Stream map方法的一系列指令。

我已成功将内联方法引用和函数转换为地图块,尝试循环这些函数,而不是复制和粘贴地图链结构100次。如何修复我的泛型结构以提供映射实现的说明?

正确答案将提供可编辑的代码,不使用强制转换(因为强制转换是我的解决方法)。

1 个答案:

答案 0 :(得分:0)

到目前为止我找到解决这个问题的唯一方法是

@Override
@SuppressWarnings( "unchecked" )
public <INPUT> Function<Pair<INPUT, INPUT>, Optional<String>> pairToBuilder() {
    return (Function) this.pairOptionalFunction;
}

@Override
@SuppressWarnings( "unchecked" )
public Function<Persistable<Long>, OUT> extractProperty()
{
    return (Function) extractProperty;
}