假设一个 Person 类:
public class Person {
private String name;
private int amount;
}
Run Code Online (Sandbox Code Playgroud)
并假设一个 Person 集合:
persons = [{"Joe", 5}, {"Joe", 8}, {"Joe", 10}, {"Jack", 3}, {"Jack",6}, {"Joe" 4},
{"Joe", 7}, {"Jack", 12}, {"Jack", 15}, {"Luke", 10}, {"Luke", 12}]
Run Code Online (Sandbox Code Playgroud)
我想要的是获取具有相同名称且相互跟随的合并元素的人员列表并求和(使用java 8 Stream);像这样的列表:
Perons = [{"Joe", 23}, {"Jack", 9}, {"Joe", 11}, {"Jack", 27}, {"Luke", 22}]
Run Code Online (Sandbox Code Playgroud) java.lang.OutOfMemoryError: java heap space 执行以下代码时抛出错误。
Stream<String> stream3 = Stream.generate(() -> {return "afdajfkljflks";});
System.out.println(stream3.collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)
为什么具体是java堆空间错误以及这段代码背后的场景System.out.println(stream3.collect(Collectors.toList()));
我有一个类Person,它有两个属性 Name( String) 和 Weight( Integer)。
我想根据它们的权重以降序将元素存储在 PriorityQueue 中,即元素在队列中的顶部权重越高。
到目前为止我已经尝试过这个:
PriorityQueue<Person> personPriorityQueue = new PriorityQueue<Person>((a,b)-> Integer.compare(a.getWeight(), b.getWeight()));
personPriorityQueue.add(new Person(40,"N1"));
personPriorityQueue.add(new Person(60,"N2"));
personPriorityQueue.add(new Person(50,"N3"));
personPriorityQueue.forEach(s-> System.out.println(s.getName()));
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
N1
N2
N3
Run Code Online (Sandbox Code Playgroud)
我应该得到:
N2
N3
N1
Run Code Online (Sandbox Code Playgroud) 我正在使用 Java 8 的 lambda 表达式来分区列表(使用.collect(Collectors.partitioningBy(...))),我需要我的分区标准是元素是否是给定类的实例。
做如下工作
list.stream().collect(Collectors.partitioningBy(elt -> elt instanceof EltType))
Run Code Online (Sandbox Code Playgroud)
但是是否存在InstanceOf可以通过方法引用使用的现有“ ”谓词?
有人可以建议,为什么我不能在这里应用方法参考?
工作代码。
System.out.println(
Arrays.stream(str.split(" "))
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting())));
Run Code Online (Sandbox Code Playgroud)
编译错误,无法解析方法
System.out.println(
Arrays.stream(str.split(" "))
.collect(Collectors.groupingBy(Function::identity,Collectors::counting)));
Run Code Online (Sandbox Code Playgroud) 从流中收集数据时,我遇到了一个令人讨厌的NullPointerException。在我看来,我不应该得到一个,这就是困扰我的地方。
这是错误的代码:
descriptiveData
.stream()
.map(Signaletiques::getContrats)
.filter(Objects::nonNull)
.collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)
descriptiveData不为null,并且不包含任何null对象,但是getContrats的结果可能是。这是一个非常有效的商业情况,我认为使用过滤器来处理它是解决问题的方法,但我所能得到的只是这个异常:
原因:java.util.stream.ReferencePipeline $ 3 $ 1.accept(ReferencePipeline.java:193)处的java.lang.NullPointerException java.util.stream处的java.util.ArrayList $ ArrayListSpliterator.tryAdvance(ArrayList.java:1351) .ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)at java.util。 java.util.stream.FindOps $ FindOp.evaluateSequential(FindOps.java:152)的java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)的stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) .util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)位于be.formatech.forhrm.appipay.synchrosignaletique.service.impl。SynchronisationAppipayUcmIdFetcherImpl.searchWorkerIdThroughContractsData(SynchronisationAppipayUcmIdFetcherImpl.java:141)`
知道这可能来自什么吗?
编辑:
我真的很抱歉 !
我在descriptiveData列表中确实有一个空值,但是IntelliJ并未显示它:

感谢@Nikolas提供的答案确实正确。
我需要将UTC日期和时间字符串(例如20180531_132001Z)解析为Java 8日期和时间对象.如何使用Java 8的新日期和时间库进行此操作?我看到的大多数示例都是针对LocalDateTime的,如下所示:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss'Z'");
LocalDateTime localDateTime = LocalDateTime.parse("20180531_132001Z", formatter);
System.out.println(localDateTime);
System.out.println(localDateTime.atOffset(ZoneOffset.UTC));
Run Code Online (Sandbox Code Playgroud)
代码输出:
2018-05-31T13:20:01
2018-05-31T13:20:01Z
Run Code Online (Sandbox Code Playgroud)
我最终需要将它持久化到SQL Server数据库表(列类型是[datetime2](7),使用[Spring] JDBC.
更新:根据评论和答案,我认为我的问题没有经过深思熟虑.换句话说,如果我得到一个输入字符串并且我解析它而不考虑任何区域或偏移量,我将得到一个LocalDateTime对象.如何获取该对象并将封装的值转换为UTC日期和时间?
我试图得到我当前的系统日期,并将其格式化为Etc/UTC,然后进入这个"dd.MM.yyyy HH:mm z"格式.问题是格式化日期后格式化函数返回一个字符串而不是日期.这是下面的代码spinet
final Date currentDate = new Date();
final SimpleDateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy HH:mm z");
dateFormatter.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
String finalDateTime= dateFormatter.format(currentDate);
System.out.println(finalDateTime);
Run Code Online (Sandbox Code Playgroud)
是否有任何替代解决方案允许我通过将我保留在此日期对象中来格式化日期,因为我已经在java 8之后和java 8之前研究了每个日期库,看起来如果我想格式化任何类型的日期或日期时间,我必须使用格式化程序将给定日期转换为字符串.
任何替代解决方案或不可能吗?
int f = 1;
f = f++;
System.out.println(f);
Run Code Online (Sandbox Code Playgroud)
post increment operator的优先级高于赋值运算符,所以我想f的值(即1)用于赋值,f增加,然后输出为2(因为f的值现在为2),但输出为1 ,但是怎么样?我哪里错了?
我的解释在下面的代码中得到了正确的答案
int f = 1;
int g = f++;
System.out.println(f);
Run Code Online (Sandbox Code Playgroud)
在这种情况下输出为2.
为什么任何人在JAVA 1.8中的接口中定义静态方法?
我需要知道静态方法会派上用场的不同示例/用例/要求.
接口中的静态方法如何对开发人员有益?
java-8 ×10
java ×9
java-stream ×4
datetime ×2
collections ×1
collectors ×1
interface ×1
java-date ×1