小编Bog*_*mac的帖子

保留行结尾

我运行sed在Windows上进行一些替换,我注意到它会自动将行结尾转换为Unix(\n).是否可以选择告诉sed使用Windows行结尾(\ r \n),甚至更好地保留文件中的行结尾?

注意:我使用unxutils中的sed:http://unxutils.sourceforge.net/

windows sed

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

为什么Java 8泛型类型推断选择了这个重载?

考虑以下程序:

public class GenericTypeInference {

    public static void main(String[] args) {
        print(new SillyGenericWrapper().get());
    }

    private static void print(Object object) {
        System.out.println("Object");
    }

    private static void print(String string) {
        System.out.println("String");
    }

    public static class SillyGenericWrapper {
        public <T> T get() {
            return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它在Java 8下打印"String",在Java 7下打印"Object".

我原以为这是Java 8中的歧义,因为两种重载方法都匹配.为什么编译器print(String)JEP 101之后选择?

是否合理,这会破坏向后兼容性,并且在编译时无法检测到更改.升级到Java 8后,代码只是偷偷摸摸地表现不同.

注意:由于SillyGenericWrapper某种原因,它被命名为"愚蠢".我试图理解为什么编译器的行为方式,不要告诉我这个愚蠢的包装器首先是一个糟糕的设计.

更新:我还尝试在Java 8下编译和运行示例,但使用的是Java 7语言级别.这种行为与Java 7一致.这是预期的,但我仍然觉得需要验证.

java generics language-lawyer java-8

35
推荐指数
2
解决办法
6211
查看次数

是否可以使用Lombok注释作为元注释?

我想为传输对象定义自己的注释,并包含一些Lombok注释作为元注释:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Data
@NoArgsConstructor
@AllArgsConstructor
public @interface TransferObject {
}
Run Code Online (Sandbox Code Playgroud)

目的是用我的所有传输对象注释@TransferObject并"继承"上述所有内容.在实践中它不起作用,注释的类@TransferObject不由Lombok处理.

有没有办法让这个工作?如果没有,理论上可以增强Lombok来寻找元注释吗?

注意:我在使用Java 8.

更新:在github上看起来有一个功能请求.

java annotations lombok

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

将ConcurrentLinkedHashMap集成到Guava中意味着什么?

我们在项目中使用来自https://code.google.com/p/concurrentlinkedhashmap/的 ConcurrentLinkedHashMap ,我看到了一条说明,它在2010年被集成到了Guava的MapMaker和CacheBuilder中.信息非常简短:

将算法技术集成到MapMaker中将在Google Guava r08中发布,并且很大程度上基于此版本.

这究竟是什么意思?

  • concurrentlinkedhashmap项目似乎仍处于活动状态.
  • 它只是一次性集成来引导Guava缓存包吗?
  • 这两个项目自2010年以来是否独立发展?
  • 如果是这样,今天它们之间的主要区别是什么?

java caching guava

12
推荐指数
1
解决办法
5224
查看次数

为什么lambda调用有2个堆栈帧?

以下代码:

public static void main(String[] args) {
    Collections.singleton(1).stream().forEach(i -> new Exception().printStackTrace());
}
Run Code Online (Sandbox Code Playgroud)

打印:

java.lang.Exception
    at PrintLambdaStackTrace.lambda$main$0(PrintLambdaStackTrace.java:6)
    at PrintLambdaStackTrace$$Lambda$1/1831932724.accept(Unknown Source)
    at java.util.Collections$2.tryAdvance(Collections.java:4717)
    at java.util.Collections$2.forEachRemaining(Collections.java:4725)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at PrintLambdaStackTrace.main(PrintLambdaStackTrace.java:6)
Run Code Online (Sandbox Code Playgroud)

lambda调用是如何实现的?为什么有2个堆栈帧?

java lambda java-8

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

解析包含=的cmdline参数

在使用批处理文件多年后,我惊讶地发现等号'='被认为是一个参数分隔符.

鉴于此测试脚本:

echo arg1: %1
echo arg2: %2
echo arg3: %3
Run Code Online (Sandbox Code Playgroud)

和调用:

test.bat a=b c
Run Code Online (Sandbox Code Playgroud)

输出是:

arg1: a
arg2: b
arg3: c
Run Code Online (Sandbox Code Playgroud)

为什么这样,怎么可以避免?我不希望脚本的用户考虑到这个怪癖并引用"a = b",这是违反直觉的.

此批处理脚本在Windows 7上运行.

=====编辑=====

更多背景:我在编写bat文件以启动Java应用程序时遇到了这个问题.我想在bat文件中使用一些args,然后将其余的传递给java应用程序.所以我的第一次尝试是做shift,然后重建args列表(因为%*不受影响shift).它看起来像这样,就在我发现问题的时候:

rem Rebuild the args, %* does not work after shift
:args
if not "%1" == "" (
  set ARGS=!ARGS! %1
  shift
  goto args
)
Run Code Online (Sandbox Code Playgroud)

下一步是不再使用shift,而是通过一次删除一个字符%*直到遇到空格来手动实现移位:

rem Remove the 1st arg if it was the profile
set ARGS=%*
if not "%FIRST_ARG%" == "%KNOA_PROFILE%" goto …
Run Code Online (Sandbox Code Playgroud)

batch-file

9
推荐指数
1
解决办法
7657
查看次数

JMockit MockUp可以模拟toString()吗?

考虑下面MockUp的一个类的示例,该类在构造函数Foo中进行拦截Bar,然后toString()根据其实现Bar;

public class FooStub extends MockUp<Foo> {

    private Bar bar;

    @Mock
    public void $init(Bar bar) {
        this.bar = bar;
    }

    @Mock
    public String toString() {
        return bar.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果Foo恰好覆盖toString()所有工作正常.否则,你得到一个IllegalArgumentException:"找不到以下模拟的真实方法".我从这里理解JMockit不查看基类,因此无法找到一个toString()模拟方法.

假设我无法修改Foo类(实际上我可以,但仅仅是为了参数),有没有办法toString()只为这个Foo类进行模拟?

要清楚,我想模拟这个类的所有实例,而不仅仅是一个实例(具有不需要的简单解决方案MockUp).

java unit-testing jmockit mocking

9
推荐指数
1
解决办法
683
查看次数

gmaven替代?

我们有几十个带有maven构建和eclipse作为IDE的java项目.现在我想在这些项目中添加对groovy的支持,所以我不可避免地要使用gmaven插件进行集成.不幸的是,gmaven现在似乎已经放弃了(没有网站更新,JIRA几乎没有任何活动).

考虑到groovy,maven和eclipse是成熟的软件,混合的java/groovy项目并不罕见,我希望有一个可靠的集成解决方案.我知道有些人将他们的构建移动到gradle,但我不愿意为我们的项目添加常规支持而做出如此重大的改变.

那么你们其他人如何处理maven/eclipse环境中的混合groovy/java项目呢?groovy社区推荐的工具链是什么?

注意:我在某种程度上能够通过JIRA的一些源代码修复得到gmaven使用groovy 1.8,但我不认为这是未来的可靠策略.

eclipse groovy maven gmaven-plugin

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

优化MERGE语句的SORT MERGE连接

考虑将更改应用于聚合表的问题.必须更新存在的行,同时必须插入新行.我的方法如下:

  • 在临时表中插入所有更改(一次100K)
  • 将临时表合并到主表中(最终达到100万行)

SQL(带有SORT MERGE提示)如下所示(没什么特别的):

merge /*+ USE_MERGE(t s) */ 
into F_SCREEN_INSTANCE t
using F_SCREEN_INSTANCE_BUF s 
    on (s.DAY_ID = t.DAY_ID and s.PARTIAL_ID = t.PARTIAL_ID)
when matched then update set 
    t.ACTIVE_TIME_SUM = t.ACTIVE_TIME_SUM + s.ACTIVE_TIME_SUM,
    t.IDLE_TIME_SUM = t.IDLE_TIME_SUM + s.IDLE_TIME_SUM
when not matched then insert values (
    s.DAY_ID, s.PARTIAL_ID, s.ID, s.AGENT_USER_ID, s.COMPUTER_ID, s.RAW_APPLICATION_ID, s.APP_USER_ID, s.APPLICATION_ID, s.USER_ID, s.RAW_MODULE_ID, s.MODULE_ID, s.START_TIME, s.RAW_SCREEN_NAME, s.SCREEN_ID, s.SCREEN_TYPE, s.ACTIVE_TIME_SUM, s.IDLE_TIME_SUM)
Run Code Online (Sandbox Code Playgroud)

F_SCREEN_INSTANCE表具有(DAY_ID, PARTIAL_ID)主键,也是IOT(索引组织表).这使其成为合并连接的理想候选者:行按查找键进行物理排序.

到现在为止还挺好.我已经开始了一个基准测试,初始时间看起来不错,合并时间为10秒.但大约一个小时后,合并大约需要4分钟,因为tempdb使用率很高(每个合并4GB).下面的查询计划显示F_SCREEN_INSTANCE在合并之前重新排序,即使表已经理想地排序.当然,随着表的增长,将需要更多的tempdb,整个方法就会崩溃.

排序合并加入

好的,为什么要重新排序表呢?它变成了合并连接实现的限制:第二个表总是排序的.

如果存在索引,则数据库可以避免对第一个数据集进行排序.但是,无论索引如何,数据库始终会对第二个数据集进行排序.

O ... K,那么我可以将主表放在第一位,将缓冲放在第二位吗?不,那也不可能.无论我如何列出USE_MERGE …

oracle performance

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

如果在JVM关闭期间再次调用System.exit()会发生什么?

它没有操作吗?JVM是否避免再次调用关闭挂钩?

对于一个用例,考虑一个为SomeException调用System.exit()的UncaughtExceptionHandler,然后在短时间内在两个单独的线程中抛出SomeException.

此外,假设在新线程中调用System.exit()以避免潜在的死锁.

UPDATE

正如其中一条评论正确地指出的那样,我应该自己测试一下,但我很懒.无论是在常规线程还是守护程序线程中调用System.exit()并在打印后以代码1退出,下面的测试都会成功完成:

Requesting shutdown ...
Shutdown started ...
Requesting shutdown ...
Shutdown completed ...
Run Code Online (Sandbox Code Playgroud)

以下是代码:

public class ConcurrentSystemExit {

  private final static boolean DAEMON = false;

  public static void main(String[] args) throws InterruptedException {

    // Register a shutdown hook that waits 6 secs
    Runtime.getRuntime().addShutdownHook(new Thread() {
      public void run() {
        try {
          System.out.println("Shutdown started ...");
          Thread.sleep(6000);
          System.out.println("Shutdown completed ...");
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    });

    // Define a Thread that calls exit()
    class ShutdownThread …
Run Code Online (Sandbox Code Playgroud)

java multithreading

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