我是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);
答案 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)
这取决于您对流的终端操作,请记住,流只能被使用一次。
Optional
的方法之一(例如findAny
),那么您可以使用可选的空检查方法。