小编qua*_*tum的帖子

使用Java 8 Stream API查找枚举值

假设有一个名为Type的简单枚举,如下所示:

enum Type{
    X("S1"),
    Y("S2");

    private String s;

    private Type(String s) {
        this.s = s;
    }
}
Run Code Online (Sandbox Code Playgroud)

s使用for-loop的静态方法(假设该方法在enum中定义)可以轻松地找到给定的正确枚举,例如:

private static Type find(String val) {
        for (Type e : Type.values()) {
            if (e.s.equals(val))
                return e;
        }
        throw new IllegalStateException(String.format("Unsupported type %s.", val));
}
Run Code Online (Sandbox Code Playgroud)

我认为使用Stream API表达的功能等价物将是这样的:

private static Type find(String val) {
     return Arrays.stream(Type.values())
            .filter(e -> e.s.equals(val))
            .reduce((t1, t2) -> t1)
            .orElseThrow(() -> {throw new IllegalStateException(String.format("Unsupported type %s.", val));});
}
Run Code Online (Sandbox Code Playgroud)

我们怎么能写得更好更简单?这段代码感觉很强烈,不太清楚.该reduce()特别是似乎笨重和滥用,因为它没有任何积累,不进行计算,并始终直接返回t1(所提供的过滤器返回一个值-如果没有这显然是一个灾难),更何况t2是有多余的混乱.然而,我在Stream API中找不到任何东西,只是以某种方式T从a 直接返回a …

java enums functional-programming java-8 java-stream

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

将外化值注入Spring注释

我一直在考虑在编译时评估注释值的Java特性,它似乎真的难以外化注释值.

但是,我不确定它是否真的不可能,所以我很感激任何建议或明确的答案.

更重要的是,我试图外化一个注释值来控制Spring中调度方法调用之间的延迟,例如:

public class SomeClass {

    private Properties props;
    private static final long delay = 0;

    @PostConstruct
    public void initializeBean() {
        Resource resource = new ClassPathResource("scheduling.properties");
        props = PropertiesLoaderUtils.loadProperties(resource);
        delay = props.getProperties("delayValue");
    }

    @Scheduled(fixedDelay = delay)
    public void someMethod(){
        // perform something
    }
}
Run Code Online (Sandbox Code Playgroud)

假设它scheduling.properties在classpath上并包含属性键delayValue及其对应的long值.

现在,这段代码有明显的编译错误,因为我们试图为final变量赋值,但这是强制性的,因为我们不能将变量赋值给注释值,除非它是static final.

有没有办法解决这个问题?我一直在考虑Spring的自定义注释,但根本问题仍然存在 - 如何将外化值分配给注释?

欢迎任何想法.

编辑:一个小的更新 - Quartz集成对于这个例子来说太过分了.我们只需要以亚分钟的分辨率进行定期执行即可.

java spring annotations spring-scheduled

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

Java 8:通过检查所有Stream元素来停止减少操作

我试图了解是否有办法终止还原操作而不检查整个流,我无法找到方法.

用例大致如下:让一长串的Integers需要折叠成一个Accumulator.每个元素检查都可能很昂贵,所以在内部Accumulator,我对传入进行检查Accumulator,看看我们是否需要执行昂贵的操作 - 如果我们不这样做,那么我只需返回累加器.

对于小(呃)列表来说,这显然是一个很好的解决方案,但是巨大的列表会产生我不想要的不必要的流元素访问成本.

这是一个代码草图 - 仅假设连续减少.

class Accumulator {
    private final Set<A> setA = new HashSet<>;
    private final Set<B> setB = new HashSet<>;
}

class ResultSupplier implements Supplier<Result> {

    private final List<Integer> ids;

    @Override
    public Result get() {
        Accumulator acc = ids.stream().reduce(new Accumulator(), f(), (x, y) -> null);

        return (acc.setA.size > 1) ? Result.invalid() : Result.valid(acc.setB);
    }

    private static BiFunction<Accumulator, Integer, Accumulator> f() {
        return (acc, element) -> {
            if …
Run Code Online (Sandbox Code Playgroud)

java reduce fold java-8 java-stream

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

OpenJPA criteriaBuilder嵌套对象属性获取

OpenJPA中是否有任何方法可以通过CriteriaBuilder获取嵌套对象属性?

这是一个小案例.

@Entity
public class X {
       private Object Y;

       // getters, setters...
}

@Entity
public class Y {
       private String Z;

       // getters, setters...
}
Run Code Online (Sandbox Code Playgroud)

因此,在使用CriteriaBuilder时,我们使用X作为Root,即:

@PersistenceContext
private EntityManager entityManager;

//.....

Root<X> rootObj = criteriaBuilder.from(X.class);
CriteriaQuery<X> select;

String param1 = X.getY().getZ();

// initializing predicate, default value is TRUE
Predicate predicate1 = criteriaBuilder.isNull(null);

// construct search predicate which fails miserably due to IllegalArgumentExecption
if (X != null) {
predicate1 = criteriaBuilder.and(predicate1, criteriaBuilder.equal(rootObj.<String> get("Y.Z"), param1));}
Run Code Online (Sandbox Code Playgroud)

现在,我的悲痛就是 - > get("Y.Z")

CriteriaBuilder不知道反射取Z(但它可以并将解析Y).有没有办法直接从get()获取Z?

除了使用JPQL之外,我还可以想到另一种方法 …

java openjpa criteria-api

17
推荐指数
2
解决办法
9958
查看次数

抑制JAXB生成的类的编译器警告

这可能是这个问题的重复(避免编译器对xjc生成的代码的警告),但由于我不太熟悉XJC/JAXB自定义绑定的特性,我可能会认为我可能误解了上述问题.

我的问题看起来很简单 - 如何@SuppressWarnings("all")在生成的JAXB类中添加注释?我们的项目有0个警告政策,在JAXB生成步骤之后,我们最终会发出350多个警告,这些警告只是可怕的噪音.

我希望XJC上有一个简单的标志,或者至少提供这样的信息的简单方法,但我找不到任何.

从我在旅行中看到的情况来看,人们会做以下事情之一:

  1. @ lexicore的JAXB2 Annotate插件,根据示例,似乎可以完成这项工作,但是添加一个完整的框架和数百KB的代码只是为了向一堆类添加简单的注释?真??,
  2. 自定义JAXB绑定(我可能会弄错,但这似乎非常晦涩,我不完全确定它是否可能以这种方式执行),
  3. 自定义ANT目标,它将在JAXB后生成搜索和替换,
  4. Eclipse 4+似乎可以选择过滤掉所选项目的警告,但出于各种历史/遗留原因,我们仍然坚持使用Eclipse 3.7.2(Indigo),
  5. 可以进行注释插入的自定义XJC插件(如其中一位评论者的建议,请参见此处),
  6. 将所有生成的类放在JAR中,使JAR成为项目的依赖项,然后完全删除生成的代码.

以前,我们通过在单独的Eclipse项目中推送与XML相关的代码然后禁用项目上的警告/错误来解决这个问题.现在,作为代码整合/重构的一部分,我们已经重新调整了一些东西,不再拥有这种奢侈品.

对于这样一个看似微不足道的问题,真的没有优雅的解决方案吗?任何反馈/想法都非常感谢.

FWIW,我们的项目使用Ant作为构建系统.

java jaxb xjc annox jaxb2-annotate-plugin

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

曼哈顿距离A*

我正在使用A*搜索算法实现一个NxN拼图求解器,并使用曼哈顿距离作为启发式算法,我遇到了一个奇怪的错误(?),我无法将其包裹起来.

考虑这些谜题(0元素是空白):(
初始)

1 0 2
7 5 4
8 6 3

(目标)

1 2 3
4 5 6
7 8 0

从初始状态到达解的最小移动次数是11.然而,我的求解器在17次移动中达到目标.

其中存在的问题是 - 我的解谜手段主要解决了正确(最小)移动数量的可解决难题,但对于这个特殊的谜题,我的求解器超过最小移动次数而且我认为我已经将问题确定为错误计算在这种特殊情况下的曼哈顿距离.

在这个链接中,你可以看到我的求解器在做什么(在右边)以及经过试验的求解器正在做什么(Brian Borowski的优秀求解器,可在此处获得).

在第一步中,Brian的解算器立即选择推动元素5的解决方案,但我的解算器有其他想法,并且在堆栈跟踪(在链接上给出),我的解算器选择向左推2的解决方案(因为该板的曼哈顿距离较低,董事会在优先队列的前面).我看不出有什么问题,我不能责怪我的曼哈顿距离计算,因为它正确地解决了许多其他3x3难题.

以下是我如何计算给定董事会的曼哈顿距离:

/**
 * Calculates sum of Manhattan distances for this board and stores it in private field to promote immutability.
 */
private void calculateManhattanDistance() {
    int manhattanDistanceSum = 0;
    for (int x = 0; x < N; x++) // x-dimension, traversing rows (i) …
Run Code Online (Sandbox Code Playgroud)

java artificial-intelligence a-star sliding-tile-puzzle

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

OpenCSV日期解析

我们使用OpenCSV来解析CSV文件,并使用CsvToBean类将其值直接绑定到模型对象(OpenJPA实体bean).

然而,问题是 - 在CSV中有一些值(显然)被解析为Strings,但应该在Date属性中设置,所以基本上CsvToBean类在尝试动态调用写入方法时死亡(即,它尝试设置Date属性) with raw String value).

OpenCSV中是否有任何工具允许我指定每列应映射到哪种类型?如果没有,你有什么建议可以扩展/重新实现以便于此吗?在/test/au/com/bytecode/opencsv/bean/目录下检查OpenCSV源代码分发中的其他可用strageties 让我没有接近结论.

我想我可以摆弄Date属性setter并使它成为一个泛型方法,它将类型作为参数传递,并尝试解析传递的值,Date如果它还没有Date,但....我们正在使用持久性注释实体,我不希望稍后看到这个"setter-hack"向我们开枪,因为OpenJPA Enhancer突然不喜欢通用的二传手.

我一直在抨击这个问题几个小时 - 我可能通过使用反射和编写我自己的bean绑定逻辑解决了这个问题,但是我不喜欢重新发明轮子并且有一种感觉/希望这可能在现有的OpenCSV框架内轻松完成.

如果需要,我可以发布一些代码,但真的没什么可看的.

有什么想法吗?谢谢.

java opencsv

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

Spring JUnit4手动/自动接线困境

我遇到了一个问题,这个问题只能解释为我对Spring的IoC容器设施和上下文设置缺乏了解,所以我会要求澄清一下.

仅供参考,我正在维护的应用程序具有以下堆栈技术:

  • Java 1.6
  • 春天2.5.6
  • RichFaces 3.3.1-GA UI
  • Spring框架用于bean管理,Spring JDBC模块用于DAO支持
  • Maven用作构建管理器
  • JUnit 4.4现在作为测试引擎引入

我追溯(sic!)为应用程序编写JUnit测试,令我感到惊讶的是,我无法通过使用setter注入将bean注入测试类而不使用@Autowire表示法.

让我提供一个示例和附带的配置文件.

测试类TypeTest非常简单:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class TypeTest {

    @Autowired
    private IType type;

    @Test
    public void testFindAllTypes() {
        List<Type> result;

        try {
            result = type.findAlltTypes();
            assertNotNull(result);
        } catch (Exception e) {
            e.printStackTrace();
            fail("Exception caught with " + e.getMessage());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

其背景定义TestStackOverflowExample-context.xml如下:

<context:property-placeholder location="classpath:testContext.properties" />
<context:annotation-config />
<tx:annotation-driven />

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${db.connection.driver.class}" />
    <property name="url" value="${db.connection.url}" />
    <property name="username" …
Run Code Online (Sandbox Code Playgroud)

java spring ioc-container junit4 autowired

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

OpenJPA脏读提示

我们有以下 DAO 堆栈:

  • DB2 9.7 Express-C
  • OpenJPA 2.0.1
  • 春季3.0.5
  • 比特力2.1.1

如何指定 OpenJPA 将WITH URsql 子句添加到查询末尾?

我浏览了好几天的网站和手册,应该是这样的:

Query q = em.createQuery("select m from Magazine m where ... ");
q.setHint("openjpa.FetchPlan.ReadLockMode","WRITE");
List r = q.getResultList();
Run Code Online (Sandbox Code Playgroud)

但可惜的是,我一直无法找到一个可以作为setHint()参数传递并WITH UR作为结果生成的工作 OpenJPA 属性,因此我使用 SpringJDBC 查询,遗憾的是我无法再使用它了。

有任何想法吗?非常感谢

java db2 openjpa

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

scala是否在函数签名中忽略了类型?

我将参加优秀的Martin Odersky的FP课程讲座,其中一个讲座通过Newton的方法演示高阶函数,以找到某些函数的固定点.在讲座中有一个重要的步骤,我认为类型签名被违反,所以我会要求解释.(对于入境的长篇介绍道歉 - 它觉得有必要.)

实现这种算法的一种方法是这样的:

  val tolerance = 0.0001

  def isCloseEnough(x: Double, y: Double) = abs((x - y) / x) / x < tolerance

  def fixedPoint(f: Double => Double)(firstGuess: Double) = {
    def iterate(guess: Double): Double = {
      val next = f(guess)
      if (isCloseEnough(guess, next)) next
      else iterate(next)
    }
    iterate(firstGuess)
  }
Run Code Online (Sandbox Code Playgroud)

接下来,我们尝试通过fixedPoint函数计算平方根,但尝试通过

def sqrt(x: Double) = fixedPoint(y => x / y)(1)
Run Code Online (Sandbox Code Playgroud)

因为这样的方法振荡(因此,sqrt(2)结果将无限期地在1.0和2.0之间交替)被挫败.

为了解决这个问题,我们引入平均阻尼,因此基本上我们计算两个最接近的计算值的平均值并收敛到解

def sqrt(x: Double) = fixedPoint(y => (y + x / y) / 2)(1)
Run Code Online (Sandbox Code Playgroud)

最后,我们介绍averageDamp …

functional-programming scala higher-order-functions

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