如何使用java Stream

时间:2015-06-03 22:08:11

标签: java lambda java-8 java-stream

我是Java 8的新手。我无法理解下面这段代码中的错误。如果它不是空的,那么我们的想法是发送Collection<User>。但是,如果集合为空,则为发送HttpStatus.NOT_FOUND实体响应。

@RequestMapping(value = "/find/pks", 
                method = RequestMethod.GET, 
                produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Collection<User>> getUsers(@RequestBody final Collection<String> pks)
{
    return StreamSupport.stream(userRepository.findAll(pks).spliterator(), false)
         .map(list -> new ResponseEntity<>(list , HttpStatus.OK))
         .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}

Eclipse在以下点.orElse

中显示错误
  

类型orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND))

的方法Stream<ResponseEntity<User>>未定义

我的基本接口方法如下所示

Iterable<T> findAll(Iterable<PK> pks);

3 个答案:

答案 0 :(得分:5)

把一切都塞进一行是没有必要的,而且经常是错误的。在这种情况下,你不能 - 你的意图没有这样的API。

保持简单:

require "csv"
require "elasticsearch"
require 'elasticsearch/transport'
Elasticsearch::Model.client = Elasticsearch::Client.new url: 'https://uz09z96il1:5g9p3h8jow@hectors-first-starte-5298580603.us-west-2.bonsai.io', log: true
#Elasticsearch::Client.new host: 'https://uz09z96il1:5g9p3h8jow@hectors-first-starte-5298580603.us-west-2.bonsai.io', log: true
#Elasticsearch::Model.client = Elasticsearch::Client.new('https://uz09z96il1:5g9p3h8jow@hectors-first-starte-5298580603.us-west-2.bonsai.io')
#client = Elasticsearch::Client.new log: true
#Elasticsearch::Model.client = Elasticsearch::Client.new url: 'https://uz09z96il1:5g9p3h8jow@hectors-first-starte-5298580603.us-west-2.bonsai.io', log: true
CSV.open("candidates.csv", "r") do |f|
  f.each_with_index do |item, i|
    next if i == 0
    p item
    client.index  index: 'data', type: 'person', body: '{
        "first": "#{item[1]}",
        "last": "#{item[2]}"
        }'
end
end

但如果你绝对必须

uninitialized constant Elasticsearch::Model (NameError)

答案 1 :(得分:4)

你混合了两件事。第一项任务是将Iterable转换为Collection,您可以使用Stream API解决这个问题:

Collection<User> list=
    StreamSupport.stream(userRepository.findAll(pks).spliterator(), false)
   .collect(Collectors.toList());

请注意,此流是User流,而不是列表流。因此,您无法使用此流将list映射到其他内容。 map操作会将流的每个元素映射到新元素。

然后您可以使用此列表创建ResponseEntity

return list.isEmpty()? new ResponseEntity<>(HttpStatus.NOT_FOUND):
                       new ResponseEntity<>(list, HttpStatus.OK);

您可以通过创建执行此步骤的Collector来结合这些步骤,虽然这不会带来任何好处,但这只是风格问题:

ResponseEntity<User> responseEntity=
    StreamSupport.stream(userRepository.findAll(pks).spliterator(), false)
   .collect(Collectors.collectingAndThen(Collectors.toList(),
      list -> list.isEmpty()? new ResponseEntity<>(HttpStatus.NOT_FOUND):
                              new ResponseEntity<>(list, HttpStatus.OK) ));

答案 2 :(得分:1)

这取决于您对流的终端操作,请记住,流只能被使用一次。

  • 是/按统计操作分组吗?然后你会得到一个0计数或一组空的地图。
  • 如果它收集到列表中,那么它就是一个空列表。
  • 如果它是返回Optional的方法之一(例如findAny),那么您可以使用可选的空检查方法。