2016-02-04 3 views
-1

кода я хочу написать, в основном выглядит следующим образом Persistable является интерфейсом в Spring Data с getId и isNewпредоставления инструкций для серии карт вызовов, общие вопросы

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) 
     }); 

Иногда я хочу, чтобы преобразовать «Длинные» для строки, другие - для 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; 
} 

здесь является реализация extractPairPair просто 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 не нравится, и я не могу придумать, как это сделать, основываясь не на этом.

обновления хотя не имеет значение, потому что проблема, как представляется, как указать поле команд, так что это в общем правильно, вот источник инструкции, это содержит некоторые бедных и обнищавшие слои код

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; 
} 

Родовой цель заключается для предоставления перечисления инструкций, которые могут быть предоставлены в Необязательный или Stream map.

Я успешно встраиваемые ссылки метод и функцию в карте блоки, пытаясь перебрать эти функции вместо копирования и вставки цепного отображения структуры 100 раз. Как я могу исправить мою структуру дженериков, чтобы предоставить инструкции для реализации сопоставления?

правильный ответ предоставит компилятивный код, который не использует литье (так как литье является моим обходным решением).

+0

Я вижу, как '' в' и INPUT' в 'Instruction' - это то, что намеренно? – Kenney

+0

@ Kenney да, потому что у вас в основном есть несколько видов входов, вывод первой вещи - это вход во второй, но первое, что также имеет вариант ввода. использование Long и String здесь предназначено для упрощения примера, преобразования на самом деле являются сложными сущностями. В идеале INPUT, это то же самое, что и OUT, но я не нашел способ сделать это. – xenoterracide

+0

Не могли бы вы добавить код для 'Pair' и' extractPair'? – Kenney

ответ

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; 
} 
Смежные вопросы