使用JUnit和Stream我有以下错误消息:
java.lang.IllegalStateException: stream has already been operated upon or closed
Run Code Online (Sandbox Code Playgroud)
我做了一个研究,可以明确的是没有可能重用流
但根据这篇文章:
使用Supplier是可以解决这个问题.
所以我目前的代码如下:
try (Stream<String> stream = Files.lines(Paths.get(fileName)) ) {
Supplier<Stream<String>> supplier = () -> stream;
logger.info("A");
logger.info("ABC {}", supplier.get().findFirst().get());
logger.info("B");
logger.info("XYZ {}", supplier.get().skip(1050).findFirst().get());
logger.info("C");
assertThat(supplier.get().count(), is(1051));
}
catch (IOException e) {
logger.error("{}", e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
怎么可以看到我用的是supplier.get()与工作Stream(其与本教程根据),但@Test打印,直到乙,因此@Test在出现故障supplier.get().skip(1050).findFirst().get(),它仍产生相同的错误消息.
我的代码和教程之间的独特区别,mime通过文件工作,教程围绕数组工作.
有什么特别的编辑工作没有任何问题?
Α
我做了以下版本(根据Eugene的代码段)
try (Stream<String> stream …Run Code Online (Sandbox Code Playgroud) 我必须在不同的时区使用Java 8日期/时间.例如:
LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39);
Instant instant = dateTime.atZone(ZoneId.of("Europe/Paris")).toInstant();
Run Code Online (Sandbox Code Playgroud)
时间帧是到dateTimes之间的实例
但我不想硬编码时区,这总是一个不好的做法
我在Java API中找不到任何常量来表示不同的时区,如https://en.m.wikipedia.org/wiki/List_of_tz_database_time_zones
是否有任何映射,因为它在短区ID?
https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html#of-java.lang.String-java.util.Map-
Ant 1.9.4与Java 1.8兼容吗?在蚂蚁的文档不是很清楚:它只是说,这是与Java 1.5的最低版本兼容。如何确定它与Java 1.8兼容?谢谢!
流是否有缓存或优化相同的调用?
list.stream()
.filter(bean -> manager.find(bean.getID()).getApi() != null)
.peek(bean -> {
Entity entity = manager.find(bean.getID());
//... logic with entity here
}
});
Run Code Online (Sandbox Code Playgroud)
manager.find()迭代期间会调用多少次?你能提出更好的方法来实现这段代码吗?
我有一个Java方法如下:
private static boolean isDateBetweenRange(DataSet obj, MyClass dataSource, ConditionContext context) {
FilterContext fc = dataSource.getData();
LocalDate dateFieldToCheck = obj.getDate(fc.getDateField()).toInstant()
.atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate minDate = fc.getMinDateValue();
LocalDate maxDate = fc.getMaxDateValue();
if (minDate == null || maxDate == null) {
minDate = context.getStartDate().toInstant().atZone(ZoneId.systemDefault())
.toLocalDate();
maxDate = context.getEndDate().toInstant().atZone(ZoneId.systemDefault())
.toLocalDate();
}
boolean result = (dateFieldToCheck.isAfter(minDate) || dateFieldToCheck.isEqual(minDate))
&& (dateFieldToCheck.isBefore(maxDate) || dateFieldToCheck.isEqual(maxDate));
return result;
}
Run Code Online (Sandbox Code Playgroud)
我也想做同样的逻辑LocalDateTime.LocalDateTime如果我重载方法,它将是完全相同的代码.
如何使该方法通用,LocalDate并LocalDateTime使用泛型或任何其他机制?
我如何根据我的类型制作context.getXXXDate()... toLocalDate()或toLocalDateTime()使用通用代码?
我在某处使用stream().map().reduce()看到了这段代码.
这个map()函数真的可以并行工作吗?如果是,那么它可以为map()函数启动多少个最大线程数?
如果我对下面的特定用例使用parallelStream()而不仅仅是stream(),该怎么办?
任何人都可以给我一个很好的例子,说明不使用parallelStream()的地方
下面的代码只是从tCode中提取tName并返回逗号分隔的String.
String ts = atList.stream().map(tcode -> {
return CacheUtil.getTCache().getTInfo(tCode).getTName();
}).reduce((tName1, tName2) -> {
return tName1 + ", " + tName2;
}).get();
Run Code Online (Sandbox Code Playgroud) 您能举一个例子,说明如何使用Java 8 Optional来转换它.
Motion motion = new Motion();
if (null!= site.getLocation() && null != site.getLocation().getLatitude() && null != site.getLocation().getLongitude()) {
Point p = GeoJson.point(site.getLocation().getLatitude(), site.getLocation().getLongitude());
motion.setLocation(p);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我这样做
Motion motion = new Motion();
Optional<Location> locationOptional = Optional.ofNullable(site.getLocation());
Point p = locationOptional
.map(location -> {
if (Optional.ofNullable(location.getLatitude()).isPresent() && Optional.ofNullable(location.getLongitude()).isPresent()) {
return GeoJson.point(location.getLatitude(), location.getLongitude());
}
return null;
})
.orElse(null);
motion.setLocation(p);
Run Code Online (Sandbox Code Playgroud) 我想使用下面的spliterator()方法保留数组元素的顺序.
但是,当我运行这个程序时,它正在生成4 2 1 3输出.
public class Test1 {
public static void main(String[] args) {
m1().anyMatch(e -> {
System.out.println(e);
return false;
});
}
private static LongStream m1() {
return StreamSupport.longStream(Arrays.spliterator(new long[] { 1, 2, 3, 4 }), true);
}
}
Run Code Online (Sandbox Code Playgroud)
请检查并告知我这是否可能.
我有2个对象列表:
List<User>
List<UserResource>
Run Code Online (Sandbox Code Playgroud)
对于User类:
public class User {
private int id;
private String name;
private String address;
**SETTERS & GETTERS**
}
Run Code Online (Sandbox Code Playgroud)
对于UserResource类:
public class UserResource {
private String name;
private String address;
**SETTERS & GETTERS**
}
Run Code Online (Sandbox Code Playgroud)
我List<User>有数据,我想映射值中name和address到UserResource的name和address,用java 8个流和lambda,但我不知道该怎么做.
在线搜索相当一段时间,但无法找到类似的问题.就像是:
List<User> users = **data inserted**
List<UserResource> resources = users.forEach(u ->{
u.setName(users.getName());
u.setAddress(users.getAddress());
});
Run Code Online (Sandbox Code Playgroud)
我试过像下面这样的东西,但我不使用构造函数,不确定如何解决它.
List<UserResource> userResources = users.stream().map(u -> new UserResource(u.getName(), u.getAddress())).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud) 我是Java 8的新手,所以我有一个列表,CollegeGroup我有一个Student有很多组.每个小组都有一个CollegeGroupMember与学生相关联的人.有没有办法在我的列表中返回这些组(studentCollegeGroups)?
final List<CollegeGroup> studentCollegeGroups = new ArrayList<>();
student.getCollegeGroupMembers().forEach(collegeGroupMember ->
studentCollegeGroups.add(collegeGroupMember.getCollegeGroup()));
Run Code Online (Sandbox Code Playgroud)