小编can*_*nge的帖子

使用Java方式返回具有多个值的结果

我习惯用Python开发,但出于工作原因必须用Java来实现.我正面临着一个在Python中无足轻重的任务,我想了解如何以正确的方式在Java中处理这个问题.

我需要解析持续时间字符串.它可以是毫秒(235毫秒)或秒(32秒).它也可以是"<1ms"作为特例.

解析在代码中至少发生三次,所以我想把它分成一个方法.但是我的代码确实需要知道,不仅仅是以ms为单位的结果值,还有它是ms还是s以及是否<1ms(0是不同的值).

在Python中,我只返回一个元组:

return (value_in_milliseconds,is_in_seconds,is_under_1ms)
Run Code Online (Sandbox Code Playgroud)

在CI中将定义这三个值的结构并返回它.在Pascal我定义了一条记录.

在Java中,我无法返回元组,我无法定义记录,所以我该怎么办?

我唯一能想到的是创建一个表示持续时间值的类.构造函数将获取字符串并解析它.该类将具有字段:int milliseconds,boolean inSeconds,boolean小于1ms.

但这听起来非常重量级 - 有更好的解决方案吗?

java

30
推荐指数
5
解决办法
6923
查看次数

Java泛型似乎对类的工作方式与方法的工作方式不同

我跟着这个:

http://rickyclarkson.blogspot.com/2006/07/duck-typing-in-java-and-no-reflection.html

而我正在努力适应这个:

<T extends CanQuack & CanWalk> void doDucklikeThings(T t)
{
    t.quack();
    t.walk();
}
Run Code Online (Sandbox Code Playgroud)

对此:

public class Activate<D extends CanQuack & CanWalk> {

    D d = new MyWaterFowl(); //Type mismatch
}
Run Code Online (Sandbox Code Playgroud)

即使MyWaterFowl实现了这些接口.

我想要一个从未在<>中提到MyWaterFowl的解决方案,因为我最终只会注入它(或者其他任何实现这些接口的东西).


如果你的答案基本上是"你不能那样做,它甚至会是什么类型的?".请解释为什么它正在为doDucklikeThings方法工作,并最终确定是否不可能对类做同样的事情,或者如果可能的话,如何做到这一点.

doDucklikeThings中的T必须是有效的,因为它正在工作.如果我把它传递给一个班级,我会传递什么?


根据要求,这里是MyWaterFowl代码:

package singleResponsibilityPrinciple;

interface CanWalk { public void walk(); }
interface CanQuack { public void quack(); }
interface CanSwim { public void swim(); }


public class MyWaterFowl implements CanWalk, CanQuack, CanSwim {

    public void walk() { System.out.println("I'm walkin` here!"); }
    public void quack() { …
Run Code Online (Sandbox Code Playgroud)

java generics duck-typing

19
推荐指数
3
解决办法
851
查看次数

这个Monster Builder是一个很好的构建器/工厂模式,用于抽象混合了setter的长构造函数吗?

这是一个关于将步骤构建器模式增强向导构建器模式组合到创建 DSL中的人机界面问题.它使用流畅的界面,虽然它使用方法链接,而不是级联.也就是说,这些方法返回不同的类型.

我面对的是一个怪物类,它有两个构造函数,它们混合了整数,字符串和一系列字符串.每个构造函数都是10个参数.它还有大约40个可选的制定者; 如果一起使用,其中一些相互冲突.它的构造代码看起来像这样:

Person person = Person("Homer","Jay", "Simpson","Homie", null, "black", "brown", 
  new Date(1), 3, "Homer Thompson", "Pie Man", "Max Power", "El Homo", 
  "Thad Supersperm", "Bald Mommy", "Rock Strongo", "Lance Uppercut", "Mr. Plow");

person.setClothing("Pants!!");     
person.setFavoriteBeer("Duff");
person.setJobTitle("Safety Inspector");
Run Code Online (Sandbox Code Playgroud)

这最终失败了,因为事实证明设置了两个最喜欢的啤酒职位是不相容的.叹.

重新设计怪物类不是一种选择.它被广泛使用.有用.我只是不想再看它直接构建了.我想写一些干净的东西来喂它.在不让开发人员记住它们的情况下遵循其规则的东西.

与我一直在研究的美妙的建造者模式相反,这个东西没有风味或类别.它在需要时始终需要一些字段和其他字段,有些仅取决于之前设置的字段.施工人员不是伸缩式的.它们提供了两种使类进入相同状态的替代方法.它们漫长而丑陋.他们想要给他们的东西各不相同.

一个流畅的建设者肯定会让长建筑师更容易看到.然而,大量可选的设置器使所需的设置器变得混乱.并且要求级联的流利构建器不满足:编译时执行.

构造函数强制开发人员显式添加必需的字段,即使将其归零也是如此.使用级联流畅的构建器时,这会丢失.与安装者失去的方式相同.我想要一种方法来阻止开发人员构建,直到添加了每个必填字段.

与许多建筑师模式不同,我所追求的不是不变性.我发现它,我正在离开课堂.我想通过查看构建它的代码来了解构造的对象是否处于良好状态.无需参考文档.这意味着它需要通过有条件的必要步骤来接受程序员.

Person makeHomer(PersonBuilder personBuilder){ //Injection avoids hardcoding implementation
    return personBuilder

         // -- These have good default values, may be skipped, and don't conflict -- //
        .doOptional() …
Run Code Online (Sandbox Code Playgroud)

java dsl design-patterns fluent builder

18
推荐指数
1
解决办法
2196
查看次数

为什么@FunctionalInterface不能在JDK中符合条件的所有接口上使用?

Java 8为我们提供了许多有趣的方法来使用功能接口,并为它们添加了一个新的注释:@FunctionalInterface.如果我们不遵守功能接口的规则(只需要一个需要覆盖的抽象方法),它的工作就是告诉编译器对我们大喊大叫.

java.util.function包中43个接口,带有此批注.搜索jdk.1.8.0/src @FunctionalInterface只能获得57次点击.为什么其他可能添加的接口(如AutoCloseable)@FunctionalInterface仍然缺少它?

注释文档中有一些模糊的提示:

"用于指示接口类型声明旨在成为功能接口的信息性注释类型"

有没有什么好的理由不打算我设计的接口(可能只是一个功能接口)不能用作一个接口?除了没有意识到它可能被添加之外,是否有任何迹象?

是不是将抽象方法添加到任何已发布的接口来阻止实现它的任何人,功能与否?我觉得玩世不恭,假设他们只是懒得去追捕他们,但其他解释是什么?

更新:看过"应该'可比'是一个'功能界面'?" 我发现我仍然有唠叨的问题.当单一方法接口和功能接口在结构上相同时,它们会有什么不同?简单的名称是不同的?Comparable和Comparator在语义上足够接近.事实证明它们在结构上是不同的,但仍然不是最好的例子......

是否有一种情况,SMI在结构上很好用作功能接口,但仍然不鼓励接口名称和方法的语义含义?或者也许是Javadocs隐含的合同?

java functional-programming java-8 functional-interface

16
推荐指数
1
解决办法
2574
查看次数

如何避免嵌套forEach调用?

我有以下代码:

interface Device {
    // ...
    boolean isDisconnected();
    void reconnect();
}

interface Gateway {
    // ...
    List<Device> getDevices();
}

...

for (Gateway gateway : gateways) {
    for(Device device : gateway.getDevices()){
        if(device.isDisconnected()){
            device.reconnect();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想使用Stream API重构代码.我的第一次尝试如下:

gateways
    .stream()
    .forEach(
        gateway -> {
            gateway
                .getDevices()
                .parallelStream()
                .filter(device -> device.isDisconnected())
                .forEach(device -> device.reconnect())
            ;
        }
    )
;
Run Code Online (Sandbox Code Playgroud)

我不喜欢它,经过一些修改后我最终得到了这段代码:

gateways
    .parallelStream()
    .map(gateway -> gateway.getDevices().parallelStream())
    .map(stream -> stream.filter(device -> device.isDisconnected()))
    .forEach(stream -> stream.forEach(device -> device.reconnect()))
;
Run Code Online (Sandbox Code Playgroud)

我的问题是是否有办法避免嵌套forEach.

java collections foreach java-8 java-stream

9
推荐指数
2
解决办法
1195
查看次数

使用运行配置从eclipse中的文件重定向stdin

曾经有一个错误在eclipse中阻止了运行配置将文件重定向到stdin,但据说它是固定的.但是,我找不到任何文档,告诉它如何修复它现在已修复.

很容易误解我想要完成的事情,所以让我明白一下.我不是在寻找能够读取文件的代码.我不打算将文件名作为arg传递.我不打算重定向stdout或stderr.

我有现有的代码,它接受正常的标准输入,而不知道它是来自键盘还是文件:

scanner = new Scanner(System.in);
number = scanner.nextInt();
Run Code Online (Sandbox Code Playgroud)

重定向文件中的输入当然可以在命令提示符下完成,但我正试图通过触发ctrl-F11击键将eclipse配置为自动完成.

公平的警告,我已经做了一些网页搜索尝试这种回答自己和许多人声称的答案是Run Configuration| Common但他们最终只为stdout工作.

java eclipse

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

如何创建未在故障跟踪中显示的自定义JUnit4断言

我想在我们的代码库中添加一些自定义断言,以正确隐藏故障跟踪.我知道如何编写一个可以静态导入的公共静态方法.我知道如何重用旧的断言或抛出新的断言AssertionError.

我无法弄清楚如何做的是将新的自定义断言保留在Failure Trace之外.我们已经习惯了故障跟踪中的第一个命中,而不是断言代码本身,而是调用断言的测试代码.

我知道有一个filtertrace控制过滤堆栈的属性,但我找不到任何关于将新断言添加到过滤器所需要做的好文档.

我想做的一个例子:

package testassertions;

import static newassertions.MyAssertions.myAssertTrue;

import org.junit.Test;

public class ExampleTest {
    @Test
    public void myAssertTruePassing() { myAssertTrue(true); }

    @Test
    public void myAssertTrueFailing() { myAssertTrue(false); }
}
Run Code Online (Sandbox Code Playgroud)
package newassertions;

import static org.junit.Assert.assertTrue;

public class MyAssertions {

    public static void myAssertTrue(boolean b) {
        assertTrue(b);
    }
}
Run Code Online (Sandbox Code Playgroud)

myAssertTrueFailing()的失败跟踪显示:

java.lang.AssertionError
    at newassertions.MyAssertions.myAssertTrue(MyAssertions.java:8)
    at testassertions.ExampleTest.myAssertTrueFailing(ExampleTest.java:12)
Run Code Online (Sandbox Code Playgroud)

我需要它只显示:

java.lang.AssertionError
    at testassertions.ExampleTest.myAssertTrueFailing(ExampleTest.java:12)
Run Code Online (Sandbox Code Playgroud)

java junit4 assertion java-5

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

如何增加一定比例的触摸面积?

我一直在尝试开发这个游戏,用户必须点击图像上的某些点.我一直根据像素位置存储这些点.通过获取onTouch事件中的X和Y坐标,我可以轻松地按下像素.但是我面临的问题是每次都难以按下像素的确切位置(因此,为了测试目的,我在所有4个方向上设置了40 px的容差).那么有没有一种方法可以设置某种容差,可以从设置菜单进行调整,以便人们可以轻松地使用不同手指尺寸的人,并从不同的屏幕尺寸播放?我们非常感谢您提供任何帮助或建议

tolerance = 40
public boolean onTouchEvent(MotionEvent event) {
    // MotionEvent object holds X-Y values
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        int XCood = (int) event.getX();
        int YCood = (int) event.getY();
        int XMin = ActXCod[index] - tolerance, 
            XMax = ActXCod[index] + tolerance, 
            YMin = ActYCod[index] - tolerance, 
            YMax = ActYCod[index] + tolerance;
        if (index < (limit - 1)) // loop to check number of images
        {
            if(XCood > XMin && XCood < XMax && YCood > YMin && YCood < …
Run Code Online (Sandbox Code Playgroud)

java android area touch

5
推荐指数
1
解决办法
525
查看次数

git status vs fetch (or pull): 如何知道“最新”是什么意思(不改变任何东西)

我做了一个git status,它说
Your branch is up-to-date with 'origin/master'.

但我还是做了一个git pull,突然它说
14 files changed, ...

而且我觉得我被骗了。我怀疑 git 没有坏。这一定意味着我不明白一些事情。

在这里这里做了一些阅读,并学习了两种非破坏性的方式来询问我是否是最新的

git status -uno

git fetch --dry-run

由于fetchpull我的一部分,我认为这两个会以与前两个相同的方式不同意。

从根本上让我感到困惑的是,我认为“最新”的意思是:“嘿,我们比较了这个存储库(主分支)的两个副本,它们是相同的”

好的,但是如果我可以用两种不同的方式提出问题并得到两种不同的答案,那么当每个问题都是关于比较两个不同的副本时,这是否意味着存储库必须至少有三个副本?

如:

A == B != C

我知道有 master 的远程副本
我知道有 master 的本地副本

这第三件事是什么鬼?

git

5
推荐指数
1
解决办法
3328
查看次数

Android位置getTime()总是返回很大的不同时间

我根据设置定期使用位置管理器,在测试用例中2分钟并尝试使用location.geTime()方法.我没有使用LocationManager.getLastKnownLocation().文件说这是UTC时间,我把它转换成当地时间,如下所示:

Date d = new Date(location.getTime());
SimpleDateFormat sdf = new SimpleDateFormat("yyMMddkkmmss';
sdf.setTimeZone(TimeZone.getTimneZone("UTC");
sdf.format(d);
Run Code Online (Sandbox Code Playgroud)

但是我的日期与我的期望不同.我写的当前时间大约是130516155000(2013-05-16 15:50:00)但是我得到040015130515.我删除了时区并将时区设置为'GMT'并且日期已经确定但是时间差别很大.在真实设备和模拟器是相同的.我已经检查了两者的时区设置,它们是正确的.请告诉我我错过了什么?

谢谢.

编辑:

我添加更多.

Log:
05-16 16:09:30.227: D/location.getTime()(1279): 1368590417000
05-16 16:09:30.237: D/NMEAGPRMCTime(1279): 040017
05-16 16:09:30.247: D/NMEAGPRMCDate(1279): 130515
Run Code Online (Sandbox Code Playgroud)

码:

public static String NMEAGPRMCTime(Date d)
{
    SimpleDateFormat sdf = new SimpleDateFormat("kkmmss");
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    String result = sdf.format(d);
    Log.d("NMEAGPRMCTime", result);
    return result;
}


public static String NMEAGPRMCDate(Date d)
{
    SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    String result = sdf.format(d);
    Log.d("NMEAGPRMCDate", result);

    return result;
}
Run Code Online (Sandbox Code Playgroud)

而已.这正是我使用的代码.

timezone android location

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

为什么分支预测相当准确?

为什么分支预测准确?我们是否可以从较高的层面来思考代码的某些分支如何在 99% 的时间内执行,而其余的则是特殊情况和异常处理?

我的问题有点模糊,但我只对这个问题的高层观点感兴趣。让我举一个例子

假设你有一个带有参数的函数

void execute(Input param) { 
  assertNotEmpty(param)
  (...)
}
Run Code Online (Sandbox Code Playgroud)

我有条件地执行我的函数,给定的参数不为空。99% 的情况下这个参数确实是非空的。那么我是否可以考虑基于神经网络的分支预测,例如,在某种程度上,由于它已经无数次看到这样的指令流(这样的断言很常见),它会简单地了解到大多数时候该参数非空并且相应地采取分支?

那么我们是否可以从以下角度来思考我们的代码:代码越干净,越可预测,甚至更常见,我们就越容易使用分支预测器?

谢谢!

cpu cpu-architecture branch-prediction

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

这个 getter-setter 闭包是否有充分的理由以这种方式在其内部对象中声明它的私有属性?

我正在关注这个:

Javascript 构造函数模式- 滚动到“Closures with getter-setters (D3.js, jQuery))”

我对my声明的方式感到困惑:

function Person(firstName, lastName) {
  var _firstName = firstName,                  // private 
      _lastName = lastName;                    // private 

  var my = {
    firstName: _firstName,                     // <- why?
    lastName: _lastName                        // <- why?
  };                                           // var my = {};?

  my.fullName = function() {                   
    return _firstName + ' ' + _lastName;       // a toString() wannabe
  };

  // Getter/setters
  my.firstName = function(value) {             
    if (!arguments.length) return _firstName;  // getter
    _firstName = value;                        // setter …
Run Code Online (Sandbox Code Playgroud)

javascript closures encapsulation

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

返回任何字符串中的第一个单词(Java)

我必须能够输入任何两个单词作为字符串.调用获取该字符串并返回第一个单词的方法.最后显示那个词.

该方法必须是for循环方法.我知道如何使用substring,我知道如何通过使用.substring(0,x)x返回第一个单词x是第一个单词的长度.

我怎样才能这样做,无论我用什么短语用于字符串,它总会返回第一个字?请解释你的工作,因为这是我在CS课程的第一年.谢谢!

java string

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