小编Cog*_*man的帖子

排序和分离立即处理流?

想象一下,我有一些看起来像这样的东西:

Stream<Integer> stream = Stream.of(2,1,3,5,6,7,9,11,10)
            .distinct()
            .sorted();
Run Code Online (Sandbox Code Playgroud)

两者的javadocs distinct()sorted()说它们是"有状态的中间操作".这是否意味着内部流将执行类似创建哈希集,添加所有流值,然后看到sorted()将这些值抛出到排序列表或排序集?或者它比那更聪明?

换句话说,是否.distinct().sorted()导致java遍历流两次或者java延迟直到执行终端操作(例如.collect)?

java java-stream

13
推荐指数
2
解决办法
655
查看次数

为什么&&的优先级高于|| (JAVA)

    boolean a = true;
    boolean b = true;
    boolean c = false;

    System.out.println(a || b && c); // true
    System.out.println(b && c || a); // true
Run Code Online (Sandbox Code Playgroud)

我刚刚发现了我认为有点古怪的东西.为什么会这样,&&并且||处于不同的优先级?我原以为他们处于同一水平.以上说明了这一点.这两个陈述都是正确的,即使从左到右的评估对第一个给出错误而对第二个给出为真.

有谁知道这背后的原因?

(顺便说一下,我本来只是在这里使用了一大堆括号,但这是旧代码提出的问题)

java operator-precedence

8
推荐指数
2
解决办法
2395
查看次数

为什么我的空检查这么慢?

所以我的代码目前看起来像这样

    public boolean in(TransactionType... types)
    {
        if (types == null || types.length == 0)
            return false;

        for (int i = 0; i < types.length; ++i)
            if (types[i] != null && types[i] == this)
                return true;
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

我把它改成了这个

    public boolean in(TransactionType... types)
    {
        if (types == null || types.length == 0)
            return false;

        for (int i = 0; i < types.length; ++i)
            if (types[i] == this)
                return true;
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

(TransactionType是一个包含大约30个值的枚举)

结果震惊了我.在我的所有测试中,第二个测试速度提高了一个数量级.我预计可能快2倍,但不是一个数量级.为什么不同?这是一个更慢的nullcheck,或者是额外的数组访问会发生什么奇怪的事情吗?

我的基准代码看起来像这样

public class App …
Run Code Online (Sandbox Code Playgroud)

java null enums

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

有序流上的减少是按顺序减少的吗?

我有一个ListA,B,C.

C reduce A reduce B != A reduce B reduce C (但是,减少(B减少C)是可以的).

换句话说,我的还原操作是关联的,但不是可交换的.

java是否对有序顺序流(例如列表中的默认流)执行减少将始终根据遭遇顺序进行减少?也就是说,java会重新排序减少(这样B减少A而不是A减少B)?

(希望这很清楚).

编辑添加一个小演示,也许有助于澄清

Stream.of(" cats ", " eat ", " bats ")
  .reduce("", (a, b) -> a + b); // cats eat bats
Run Code Online (Sandbox Code Playgroud)

有了上述,输出可能是"蝙蝠猫吃"​​或"吃蝙蝠猫"?是否在规范的某处保证了?

java java-8 java-stream

7
推荐指数
2
解决办法
1165
查看次数

可选注射匕首2

是否可以选择在匕首2中插入值?我尤其想做这样的事情。

@Inject A(Optional<B> b) {
  this.b = b;
}
Run Code Online (Sandbox Code Playgroud)

如果B在模块中未定义,我想用匕首给出一个Optional.empty(),如果已定义则给定Optional.of(value)

这是可行的,还是我需要一个定义这些可选值的模块?

java dependency-injection dagger-2

6
推荐指数
1
解决办法
2813
查看次数

如何检查字体是否存在

我正在使用java.awt.Font,我怎样才能发现系统上是否安装了定义的字体?

具体来说,我有

Font font = new Font("FooBar", 0, 14);
Run Code Online (Sandbox Code Playgroud)

我想发现"font"是否是系统上的有效字体,如果不可用,则默认为更通用的字体.

java fonts awt

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

是否在插入之前或之后生成SQL Server默认值?

我有一张看起来像这样的桌子

CREATE TABLE bob
    (ID INT IDENTITY,
    blah VARBINARY(MAX),
    ts DATETIME2 DEFAULT GETUTCDATE())
Run Code Online (Sandbox Code Playgroud)

我们假设这个陈述

INSERT INTO dbo.bob
        ( blah )
VALUES  (
          @blarg
          )
Run Code Online (Sandbox Code Playgroud)

需要10秒钟才能完成.

如果插入开始的时间是t.ts会在新创建的行上有t或t + 10秒吗?换句话说,是在插入的开头或插入的结尾(或其他一些规则)生成的默认值?

sql-server sql-insert

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

是否有一个忽略.equals的java Set集合

我在做一些奇怪的事情.我想创建一个Set,但是我想忽略那些对象上的equals覆盖,而是我想为等于比较(真的)做obj1 == obj2.

所以想象一下,我有几个看起来像这样的物体

public static class BrokenEquals
{
    @Override
    public int hashCode()
    {
        return 1;
    }


    @Override
    public boolean equals(Object obj)
    {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做

    Set<Object> objs = new HashSet<>();
    objs.add(new BrokenEquals());
    objs.add(new BrokenEquals()); // objs.size() == 1
Run Code Online (Sandbox Code Playgroud)

显然,Set的大小为1(因为这两个对象是"相等的").相反,我希望该集合包含两个不同的对象.

但是,如果我这样做

    BrokenEquals obj = new BrokenEquals();
    Set<Object> objs = new HashSet<Object>();
    objs.add(obj);
    objs.add(obj); // objs.size() == 1
Run Code Online (Sandbox Code Playgroud)

我希望集合的大小为1;

我没有权限更改.equals方法

我想要这个的原因是我正在遍历带有循环的对象图.我不想陷入其中.

java reflection set

2
推荐指数
1
解决办法
125
查看次数

使用Apache HttpComponents HttpClient测量带宽使用情况

如何衡量我的应用程序的HttpClients带宽使用情况?(HttpComponents 4.3)

我有一个使用HttpClient与服务器通信的客户端应用程序.所有请求都使用池化http连接管理器通过同一客户端完成.不幸的是,大多数请求直接使用httpclient(不是全部),因此在请求位置测量带宽是可行的,但很痛苦.

在客户端的构造函数或连接管理器中是否有一个位置,我可以简单地注入我自己的带宽监视器(或者是已经构建在我尚未发现的某个地方)?

我可以这样做吗?

    HttpClientBuilder.create().addInterceptorLast(new HttpResponseInterceptor()
    {

        @Override
        public void process(HttpResponse response, HttpContext context) throws HttpException, IOException
        {

        }
    }).build();
Run Code Online (Sandbox Code Playgroud)

java apache-httpcomponents

2
推荐指数
1
解决办法
838
查看次数