Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-54982

Using Java8 Streams evaluates whole expression to Boolean

XMLWordPrintable

      I'm trying to write a common library building Docker images from Dockerfile. I wrote a reusable global pipeline, where I'm iterating over Dockerfile lines. I tried to use Java 8 Streams, however I ended up with issue potentially related to JENKINS-26307 and JENKINS-42769, which is not related not to Groovy functional features, but Java 8 feature.

       An example code used:

      def getMissingLabels(Map<String, String> labels) {
       ['label1', 'label2', 'label3', 'label4'].stream()
              .filter({ label -> !isLabelDefined(label, labels) })
              .collect(Collectors.toList())
      }
      

      Whole stream execution results in "false" boolean result, instead of a list. Even complex streams are passing through, but evaluates to "false". When using more complex stream like:

       

      Arrays.stream(splitted)
                  .filter { it.startsWith('LABEL') }
                  .map { it.replaceAll('(LABEL)|"', '') }
                  .map { it.trim() }
                  .map { it.split('=', 2) }
                  .collect(Collectors.toMap(
                  { val -> val[0].toLowerCase() },
                  { val -> val[1] }))
      

      it enters only first filter expression and does not evaluate the rest.

      When replaced functional style code with typical imperative style (for loop) it works.

       

            Unassigned Unassigned
            filipowm Mateusz Filipowicz
            Votes:
            3 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated: