重用代码块来迭代NodeList JAXP

时间:2016-07-31 20:32:09

标签: java xml oop recursion functional-programming

我有一个代码块,我使用的代码比我想要的多,但我很难替换它,因为它正在迭代列表并在最后执行不同的操作。我想让事情尽可能简单,因为代码现在看起来很难看,我想将它重构为更合适的状态。

我正在使用JAXP来创建我在家中用于个人项目的自定义XML。现在我从XML String创建我的对象,从文件中读取。由于存在大量的继承和接口,因此存在大量的反射代码和大量的递归。

现在..我得到了我读过的XML字符串,我得到了一个父Node。此节点包含大量具有更多子元素的子节点。你明白了。

但我使用不同的元素进行不同的操作。

我经常使用这段代码:

if (node.hasChildNodes()) {
    NodeList fieldsNodeList = node.getChildNodes();
    for (int x = 0; x < fieldsNodeList.getLength(); x++) {
        Node fieldNode = fieldsNodeList.item(x);
        if (fieldNode.getNodeType() == Node.ELEMENT_NODE) {
            // Different action here... 
        }
    }
}

这只是一个检查元素子元素的代码,如果存在,则迭代它们。

现在问题在于我采取了不同的行动。

我想到的第一个溶剂:动作解析器。

只需在//Different action here...块处放置一个动作处理程序..无法做到这一点。我得到了一部分连续3次执行此操作的代码。它首次迭代并获取当前元素,基于它们创建对象并再次迭代(递归调用应该在这里很好)。在第二个循环中,它采用相同的代码和之前创建的对象,并对它们执行一些不同的操作,例如获取新值,创建新实例,编辑新值。现在......还有第三部分再次循环循环但仅针对某些字段并再次使用不同的操作。

你可以想象很多可能发生的情况。 我无法实现递归sollution,我无法实现动作处理程序sollution,而且我对这段代码变得毫无希望。

对我来说,我需要的最好的溶剂就像lambda sollution与谓词解决方案混合在一起,因为我非常喜欢Predicates。

这样的东西
public void doSomeStuff(*SomethingLikePredicateHere* action){
// huge loop here
if (node.hasChildNodes()) {
    NodeList fieldsNodeList = node.getChildNodes();
    for (int x = 0; x < fieldsNodeList.getLength(); x++) {
        Node fieldNode = fieldsNodeList.item(x);
        if (fieldNode.getNodeType() == Node.ELEMENT_NODE) {
            //Do the action here for the given fieldNode
        }
    }
}  

电话会是这样的:

doSomeStuff(node -> {BLOCK_OF_CODE_HERE});

在块中我应该添加另一个东西,比如创建给定字段名称的实例并填充值。然后使用新的代码块调用doSomeStuff方法..

所以我将有两个代码块,我将插入。

因此,在简化版中,调用将如下所示:

doSomeStuff(node -> {
   MyObject objectInstance = new Object(node);
   //Some other code...
   doSomeStuff(node -> {
      objectInstance.addNewProperty(node);
   }
} 

代码将迭代大块代码,在第一次调用时它将占用每个Node并创建它的实例,然后再次递归调用该方法,但现在采用新的Node和将它们作为参数添加到之前创建的实例中。

现在......这个例子很容易做,但逻辑变得复杂,我想尽可能简单地做,我很懒,在代码中编写循环milion次,它不是{{1}所以溪流和其他东西都没有用,不同的解决方案都失败了,我很绝望。有什么想法吗?

0 个答案:

没有答案