小编Hul*_*ulk的帖子

Java8 Stream:满足条件后收集元素

我的POJO如下

class EventUser {
  private id;
  private userId;
  private eventId;
}
Run Code Online (Sandbox Code Playgroud)

我按如下方式检索EventUser对象:

List<EventUser> eventUsers = eventUserRepository.findByUserId(userId);
Run Code Online (Sandbox Code Playgroud)

说'eventUsers'如下:

[
{"id":"id200","userId":"001","eventId":"1010"},
{"id":"id101","userId":"001","eventId":"4212"},
{"id":"id402","userId":"001","eventId":"1221"},
{"id":"id301","userId":"001","eventId":"2423"},
{"id":"id701","userId":"001","eventId":"5423"},
{"id":"id601","userId":"001","eventId":"7423"}
]
Run Code Online (Sandbox Code Playgroud)

使用流式传输,而不使用任何中间变量,如何在给定的EventUser.id之后过滤和收集事件:ex:

List<EventUser> filteredByOffSet = eventUsers.stream.SOMEFILTER_AND_COLLECT("id301");
Run Code Online (Sandbox Code Playgroud)

结果应该是:

[{"id":"id301","userId":"001","eventId":"2423"},
{"id":"id701","userId":"001","eventId":"5423"},
{"id":"id601","userId":"001","eventId":"7423"}]
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

28
推荐指数
3
解决办法
3598
查看次数

Oracle Java教程 - 在回答问题时可能出现错误

我是Java新手,阅读Oracle教程.在每个部分之后,有问题和答案,我不理解一个答案中的句子(见下面的粗体线).

来源是https://docs.oracle.com/javase/tutorial/java/javaOO/QandE/objects-answers.html

我指的是问题2,看到粗体字.据我所知,如果没有对数组的引用,则数组有资格进行垃圾回收.无关紧要,是否存在对此数组所持有的对象的引用,因为内部对象(在数组内)具有自己的引用计数.是对的吗?请解释粗体句.

从oracle教程中引用:https://docs.oracle.com/javase/tutorial/java/javaOO/QandE/objects-answers.html

  1. 问题:以下代码创建一个数组和一个字符串对象.代码执行后,对这些对象有多少引用?对象是否有资格进行垃圾回收?

    String[] students = new String[10];
    String studentName = "Peter Smith";
    students[0] = studentName;
    studentName = null;
    
    Run Code Online (Sandbox Code Playgroud)

    答:有一个对students数组的引用,该数组有一个对字符串Peter Smith的引用.这两个对象都没有资格进行垃圾回收.数组学生没有资格进行垃圾收集,因为它有一个对象studentName的引用,即使该对象已被赋值为null.该对象studentName不符合条件,因为 students[0]仍然引用它.

java

18
推荐指数
2
解决办法
1164
查看次数

Stream.max()如何处理相等?

虽然我怀疑答案是"它未指定"......

如果有多个"最大/最低"的元素Stream,其中Comparator传递到最大最小的方法认为等于(返回0)时,它指定某处哪个元素会被发现?

java java-8 java-stream

16
推荐指数
2
解决办法
704
查看次数

Double.isFinite实现细节 - 为什么DoubleConsts.MAX_VALUE而不是Double.MAX_VALUE?

我查找了Double.isFinite()自java 8以来存在的实现(因为我需要java 7中的功能):

public static boolean isFinite(double d) {
    return Math.abs(d) <= DoubleConsts.MAX_VALUE;
}
Run Code Online (Sandbox Code Playgroud)

其中DoubleConsts.MAX_VALUEdouble sun.misc.DoubleConsts.MAX_VALUE与所述值1.7976931348623157E308.这似乎相当于Double.MAX_VALUE,定义为:

public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308
Run Code Online (Sandbox Code Playgroud)

为什么这个实现使用sun.misc-package中的常量而不是Double.MAX_VALUE

(Float.isFinite使用相同的模式)

java java-8

11
推荐指数
1
解决办法
403
查看次数

Log4j 2 JSON模式布局+记录JSON有效负载

我正在使用ELK堆栈和log4j 2通过sl4j和json模式布局来记录消息.我的所有日​​志都记录为json消息.在我的一个日志中,我正在尝试记录json从第三方服务收到的响应.但是这个响应json主体没有附加到json结构中.但它更多地附加为包含转义字符的字符串.

如何记录最终日志.

 {
    "timeMillis": 1471862316416,
    "thread": "FioranoMQ Pubsub Session Thread",
    "level": "INFO",
    "loggerName": "com.mlp.eventing.bridge.fiorano.TopicMessageListener",
    "message": "{\"Msgtype\":\"SentToRabbitMqTest\",\"MessageData\":\"10\",\"opration\":\"devide\"}",
    "endOfBatch": false,
    "loggerFqcn": "org.apache.logging.slf4j.Log4jLogger",
    "threadId": 28,
    "threadPriority": 5
}
Run Code Online (Sandbox Code Playgroud)

在上面的消息段中作为转义字符串而不是整个json结构附加.我的预期出局应该是

{
    "timeMillis": 1471862316416,
    "thread": "FioranoMQ Pubsub Session Thread",
    "level": "INFO",
    "loggerName": "com.mlp.eventing.bridge.fiorano.TopicMessageListener",
    "message": {
        "Msgtype": "SentToRabbitMqTest",
        "MessageData": "10",
        "opration": "devide"
    },
    "endOfBatch": false,
    "loggerFqcn": "org.apache.logging.slf4j.Log4jLogger",
    "threadId": 28,
    "threadPriority": 5
}
Run Code Online (Sandbox Code Playgroud)

我期待使用神交过滤器提取的消息段的字段jsonshipper.conf

以下是我的配置: - log4j2.xml

<?xml version="1.0" …
Run Code Online (Sandbox Code Playgroud)

java logging json log4j2 elastic-stack

10
推荐指数
1
解决办法
4564
查看次数

在二进制数中找到第一个置位

我需要从右到左查找二进制数中的第一个置位;我想出了这个解决方案:

int cnt=0;
while (number& 1 ==0)
{
    cnt++;
    number>>=1;
}
Run Code Online (Sandbox Code Playgroud)

有更好的方法吗?一些聪明的位操纵技术?

c++ bit-manipulation

8
推荐指数
3
解决办法
1万
查看次数

简单名称和限定名称

我正在阅读JLS 8,在第6章中写道:

限定名称Nx可用于指代包或引用类型的成员,其中N是简单或限定名称,x是标识符.如果N命名一个包,则x是该包的成员,该包是类或接口类型或子包.如果N命名引用类型或引用类型的变量,则x命名该类型的成员,该类型是类,接口,字段或方法.

所以我可以想象这样:

class C
{
    public int n;
}

int j;
C c = new C(); 
j = 11;  
c.n = 11;
Run Code Online (Sandbox Code Playgroud)

j是一个简单的名称,c.n而是一个合格的名称.

然而在6.2中事情变得复杂.给出这段代码:

class Test { 
 public static void main(String[] args) { 
 Class c = System.out.getClass(); 
 System.out.println(c.toString().length() + 
 args[0].length() + args.length); 
 } 
}
Run Code Online (Sandbox Code Playgroud)

之后说:

args.length中长度的出现是一个名称,因为args.length是限定名称(第6.5.6.2节)而不是字段访问表达式(第15.11节).字段访问表达式以及方法调用表达式,方法引用表达式和限定类实例创建表达式使用标识符而不是名称来表示感兴趣的成员.因此,args [0] .length()中长度的出现不是名称,而是出现在方法调用表达式中的标识符.

所以我想我明白,并非所有表达都是合格的名字,甚至是我的表达 c.n

老实说,我无法理解任何人可以帮助我的区别?

java

8
推荐指数
1
解决办法
1438
查看次数

如何获得非零值的Matrix值

我正在使用opencv将一些matlab代码翻译成c ++.我想获得满足条件的Matrix的值.我为此创建了一个蒙版,当我将它应用到原始矩阵时,我得到的原始矩阵大小相同,但是掩码中没有0值.但我的问题是如何才能获得矩阵中非零值并将其分配给不同的矩阵.

我的matlab代码是:

 for i= 1:size(no,1)
        mask= labels==i;
        op = orig(mask, :); //op only contains the values from the orig matrix which are in the mask. So orig size and op size is not the same
.....
end
Run Code Online (Sandbox Code Playgroud)

我现在的c ++翻译是:

for (int i=0; i<n.rows; i++)
{
    Mat mask;
    compare(labels,i,mask,CMP_EQ);
    Mat op;
    orig.copyTo(op,mask); //Here the orig size and the op size is always same but values which are not in the mask are 0
}
Run Code Online (Sandbox Code Playgroud)

那么,我怎样才能创建一个只有掩码满足的值的矩阵?

c++ opencv

7
推荐指数
1
解决办法
2122
查看次数

Stream.count()是否保证访问每个元素?

换句话说,是否保证以下行打印num线?

int num = list.stream().peek(System.out::println).count();
Run Code Online (Sandbox Code Playgroud)

这个问题是由/sf/answers/2894261051/的评论中的讨论引发的

我依稀记得一个讨论,即避免迭代的优化可能是合法的,但在快速搜索期间没有找到任何结论.

Stream.countJavaDocs包含以下语句:

这是减少的特殊情况,相当于:
return mapToLong(e -> 1L).sum();

但我不确定这是否能提供任何保证,如果流可以某种方式以短路的方式确定结果.

java java-8 java-stream

7
推荐指数
1
解决办法
197
查看次数

java.lang.Thread - threadStatus来自哪里?

通过Java源代码我们有

// variable not written or updated anywhere on this class
private volatile int threadStatus = 0;

public State getState() {
    // get current thread state
    return sun.misc.VM.toThreadState(threadStatus);
}
Run Code Online (Sandbox Code Playgroud)

如何以及在何处threadStatus更新?

我们的想法是最终尝试使用AOP编写更新方法,并对threadStatus更改进行回调.

java

7
推荐指数
1
解决办法
328
查看次数