小编use*_*551的帖子

检查String是否表示Java中的整数的最佳方法是什么?

我通常使用以下习惯来检查String是否可以转换为整数.

public boolean isInteger( String input ) {
    try {
        Integer.parseInt( input );
        return true;
    }
    catch( Exception e ) {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

它只是我,还是看起来有点hackish?什么是更好的方式?


看看我的回答(基于CodingWithSpike早期答案基准),看看为什么我改变了我的立场并接受了Jonas Klemming对这个问题的回答.我认为这个原始代码将被大多数人使用,因为它实现起来更快,更易于维护,但是当提供非整数数据时,它会慢一个数量级.

java string int

203
推荐指数
11
解决办法
16万
查看次数

检查返回值是否为空,如果是,则在一行中使用一个方法调用进行分配

Java充斥着如下语句:

if(cage.getChicken() != null) {
    dinner = cage.getChicken();
} else {
    dinner = getFreeRangeChicken();
}
Run Code Online (Sandbox Code Playgroud)

getChicken()在返回的对象可以分配之前需要两次调用dinner.

这也可以写成一行,如下所示:

dinner = cage.getChicken() != null? cage.getChicken() : getFreeRangeChicken();
Run Code Online (Sandbox Code Playgroud)

但唉,还有两个电话getChicken().

当然我们可以分配一个局部变量,然后再次使用三元运算符来分配它,如果它不是null,但这是两行而不是那么漂亮:

FutureMeal chicken = cage.getChicken();
dinner = chicken != null? chicken : getFreeRangeChicken();
Run Code Online (Sandbox Code Playgroud)

那么有什么方法可以说:

变量var =某些值,如果某个值不为null或其他值;

我想我只是在这里讨论语法,在编译代码之后,它可能没有太大的区别代码是如何在性能意义上编写的.

因为这是一个很常见的代码,所以有一个单行写入它会很棒.

是否有其他语言有此功能?

java syntax null variable-assignment method-call

48
推荐指数
6
解决办法
8万
查看次数

为什么Java 8的Predicate <T>不扩展Function <T,Boolean>

如果我编写Predicate接口,我想在接口中编码它只是一个返回原始布尔值的函数,如下所示:

@FunctionalInterface
public interface Predicate<T> extends Function<T, Boolean> {

    boolean test(T t);

    @Override
    default Boolean apply(T t) {
        return Boolean.valueOf(test(t));
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道,有没有令人信服的理由让Java 8 API设计者选择将Predicate与Function完全分开?是否有一些证据表明他们认为这样做并决定反对呢?我想类似的问题适用于所有其他'特殊'功能接口,如Consumer(可能是Function <T,Void>),Supplier(Function <Void,T>)和原始函数,如IntFunction(Function <Integer,T>).

我没有深入和彻底地考虑过这个问题的所有后果,所以我可能会遗漏一些东西.

编辑:一些答案强调了应用和测试之间的语义区别.我不是说我不欣赏这种区别,我同意这种区别是有益的.我不明白的是,为什么Predicate不是一个函数,就像List是一个Collection或Double是一个Number,它是一个Object.

如果Predicate(以及所有其他特殊的通用功能接口,例如Consumer,Supplier,IntUnaryOperator等)与Function有这种关系,它将允许人们在预期使用Function参数的地方使用它(想到的是组合与其他功能,例如,呼叫myFunction.compose(比如说myPredicate)或避免在API中写入几个专门的功能时,如上所述的这种汽车(未)拳击实施将是足够的)

编辑2:看看openjdk lambda项目,我发现原始的功能接口用于扩展功能,直到2012-12-19的Brian Goetz提交.我找不到具体的原因,在那个时候对任何lambda-dev或JSR专家组邮件列表进行了更改.

java lambda functional-programming predicate java-8

38
推荐指数
4
解决办法
4830
查看次数

使用新的java.time API解析时区的速度非常慢

我只是将模块从旧的Java日期迁移到新的java.time API,并注意到性能大幅下降.它归结为用时区解析日期(我一次解析数百万个).

解析没有时区(yyyy/MM/dd HH:mm:ss)的日期字符串很快 - 比旧的Java日期快2倍,在我的电脑上每秒约1.5M操作.

但是,当模式包含时区(yyyy/MM/dd HH:mm:ss z)时,使用新java.timeAPI 的性能下降约15倍,而使用旧API时,性能与没有时区的速度一样快.请参阅下面的性能基准.

有没有人知道我是否能以某种方式使用新的java.timeAPI 快速解析这些字符串?目前,作为一种解决方法,我使用旧的API进行解析,然后将其转换Date为Instant,这不是特别好.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.concurrent.TimeUnit;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OperationsPerInvocation;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@OutputTimeUnit(TimeUnit.MILLISECONDS)
@BenchmarkMode(Mode.AverageTime)
@OperationsPerInvocation(1)
@Fork(1)
@Warmup(iterations = 3)
@Measurement(iterations = 5)
@State(Scope.Thread)
public class DateParsingBenchmark {

    private final int …
Run Code Online (Sandbox Code Playgroud)

java performance java-8 jmh java-time

30
推荐指数
2
解决办法
2195
查看次数

Javadoc如何处理Java 9中模块的可见性?

Javadoc工具基于可访问性修饰符生成文档.默认情况下,它记录所有publicprotected类,字段和方法.可以使用以下选项更改此设置:

-public
仅显示公共类和成员.

-protected
仅显示受保护的公共类和成员.这是默认值.

-package
仅显示包,受保护和公共类和成员.

-private
显示所有类和成员.

Java 9引入了模块的概念,项目Jigsaw将其应用于现有的JDK.一马克莱因霍尔德(在一系列有关模块会谈3日)显示了如何public修改目前已拥有不同级别的可访问的,这取决于模块(通过可见性exports):

  • 公开给大家
  • 公开但仅限于特定模块
  • 仅在模块内公开

由于现在并非所有公共成员都可以访问,因此继续使用相同的Javadoc生成方案将没有多大意义.只有那些暴露在"足够"水平的成员才应该被记录下来.

Javadoc模块是否可识别?除了上面的命令选项还有处理额外曝光层的命令选项吗?对于仅暴露给特定模块的公共成员,Javadoc是否列出了这些,如

public <module1, module2> static void getDefaultThing()
Run Code Online (Sandbox Code Playgroud)

java javadoc java-platform-module-system java-9 java-module

23
推荐指数
1
解决办法
852
查看次数

由于某些中间构造函数调用,没有可用的PerfHelper类型的封闭实例

考虑以下代码:

class abstract Normal1 extends Something 
{
}

class Outer 
{
  class abstract Inner extends Normal1
  {

  }
}

class General extends Outer.Inner  // Problem occurs at this 
{
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是"由于一些中间构造函数调用,没有可用的PerfHelper类型的封闭实例"

我的问题是我可以像上面那样扩展内部类吗?

java abstract inner-classes

22
推荐指数
2
解决办法
2万
查看次数

迭代可变长度数组

如何迭代可变长度的Java数组.

我想我会设置一个while循环,但是如何检测到我已到达数组的末尾.

我想我想要这样的东西[只需要弄清楚如何表示myArray.notEndofArray()]

index = 0;
while(myArray.notEndofArray()){
  system.out.println(myArray(index));
  index++;
}
Run Code Online (Sandbox Code Playgroud)

java arrays iteration

21
推荐指数
2
解决办法
10万
查看次数

是否有可能在执行时间内看到对象的所有引用?

有没有办法在执行时间内查看对象的所有引用?

我正在使用Netbeans,它中是否存在此功能?

编辑:使用分析器执行此操作没有问题,我只需要知道引用,无论如何.

java netbeans reference object

20
推荐指数
4
解决办法
1万
查看次数

C/C++最快的cmath日志操作

我正在尝试计算log a b(并获得一个浮点,而不是一个整数).我打算这样做log(b)/log(a).从数学上讲,我可以使用任何cmath日志函数(基数2,e或10)来进行此计算; 但是,我会在我的程序中运行这个计算很多,所以我想知道其中一个是否比其他程序快得多(或者更好的是,如果有更快,但仍然很简单的方法).如果重要,a和b都是整数.

c c++ logarithm math.h cmath

20
推荐指数
2
解决办法
9431
查看次数

如何使用键绑定而不是键侦听器

KeyListener在我的代码(游戏或其他)中使用s作为我的屏幕对象对用户键输入做出反应的方式.这是我的代码:

public class MyGame extends JFrame {

    static int up = KeyEvent.VK_UP;
    static int right = KeyEvent.VK_RIGHT;
    static int down = KeyEvent.VK_DOWN;
    static int left = KeyEvent.VK_LEFT;
    static int fire = KeyEvent.VK_Q;

    public MyGame() {

//      Do all the layout management and what not...
        JLabel obj1 = new JLabel();
        JLabel obj2 = new JLabel();
        obj1.addKeyListener(new MyKeyListener());
        obj2.addKeyListener(new MyKeyListener());
        add(obj1);
        add(obj2);
//      Do other GUI things...
    }

    static void move(int direction, Object source) {

        // do something
    }

    static …
Run Code Online (Sandbox Code Playgroud)

java swing key-events keyevent key-bindings

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