编写收集器或嵌套现有收集器

时间:2016-08-01 16:30:25

标签: java lambda collectors

我在数据结构中有一个方法,我希望用它来传递各种收集器并将它们应用到我的对象中。

以下是方法 - >

 public <R> R applyCollector(String key, Collector a)
    {
        this.key = key;
        this.a = a;
        R result = (R) this.stateList.stream().
                map(state -> state.getKey(key)).collect(a);
        return  result;
    }

上述方法主要采用&#34;键&#34;以及它应用于按键获得的值的收集器。

这就是我使用它的方式 - &gt;

Collector stringToListCollector =
               Collectors.toList();
List<String> values =
               myObject.applyCollector("key",
                       stringToListCollector);

这适用于简单的事情,例如计算,平均等等。

但是,如果我希望发送更复杂的东西,比如嵌套收集器,该怎么办? 例如,说我的&#34;键&#34;返回一个String,实际上是一个IP甚至是一个整数。

我想要做的是发送一个收集器,首先通过执行&#34; integer :: parseInt&#34;将我的字符串转换为整数。然后执行toList。

现在我必须先检索一个名为values的列表(如上所述)。然后执行values.stream().Map(Integer::ParseString).collect(Collectors::averagingInt).

我可能需要多次执行此操作,我有两个选择。

  1. 将ToList,Map和Collect作为一个函数。并称之为。这个 打败了我的lambda。

  2. 编写或嵌套现有收藏家,直接为我做。这个     选项看起来更整洁,因为如果我能正确地做到这一点,我就会     能够在One Pass中完成所有任务而不是2次传球     我现在,以及可能保存我需要先创建的内存     列表

  3. 我该怎么做?写一个收集器 - &gt;

    • 获取一个对象,并在其上运行Integer :: ParseInt然后执行 平均操作。

1 个答案:

答案 0 :(得分:1)

对于您的示例,它看起来像

</head>
<body>
<div id='header'>
<h2>Welcome to Lingo!</h2>
</div>
<div id='game area'>
<form action="" method="get">
<input type="text" value="" id="textfield"></input>
<div id="select_div"><a href="#" id="select_link">Test</a></div>
</form>
</div>
<script type="text/javascript">

$(document).ready(function(){

$('#select_div').click(function(e){
$.get('http://localhost:3001',function(res){
alert("Worked");
});
});
});    
</script>
</body>
</html>

收藏家可以在某种程度上组成:

  • applyCollector("key", mapping(Integer::parseInt, averagingInt(i -> i)) 在收集
  • 之前执行功能
  • Collectors.mapping收集后执行功能

另外一些收藏家接受下游收藏家,即Collectors.collectingAndThen