如何使用lambdas实现反向映射Java?

时间:2014-07-25 01:12:40

标签: java lambda mapping

据我所知,在Java 8中,映射的工作原理如下

enter image description here

例如:

List<String> objList = Arrays.asList("1", "2", "3", "4", "5", "6", "7");
 objList.stream().map( i -> i ). forEach( i -> System.out.print(" " + i));

输出:

1 2 3 4 5 6 7

但我的问题是:我如何进行反向映射?喜欢

enter image description here

所以输出就是这个

 7 6 5 4 3 2 1 

或者不可能这样做?

1 个答案:

答案 0 :(得分:2)

在此示例中,我将列表累积为LinkedList

LinkedList实现Deque(双端队列),允许我以后进先出(LIFO)顺序追加项目。

我使用LinkedList :: addFirst在collect方法中执行累积,它将从流中读取的项目放在列表的头部。

public static void main(final String... args) {

    final List<String> objList = Arrays.asList("1", "2", "3", "4", "5", "6", "7");


    final List<String> reversed = objList.stream()
        .collect(LinkedList::new, LinkedList::addFirst, LinkedList::addAll);

    //[7, 6, 5, 4, 3, 2, 1]  
    System.out.println(reversed);

}

下面的解决方案还可以,但我不想关闭原始列表。

public static void main(final String... args) {

    final List<String> objList = Arrays.asList("1", "2", "3", "4", "5", "6", "7");

     final List<String> reversed = IntStream.range(-(objList.size() - 1), 1)
        .mapToObj(i -> objList.get(-i))
        .collect(Collectors.toList());

    //[7, 6, 5, 4, 3, 2, 1]  
    System.out.println(reversed);

}