<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Adam Cervenka</title>
    <description>The latest articles on DEV Community by Adam Cervenka (@cerveada).</description>
    <link>https://dev.to/cerveada</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F696544%2F5d4d2457-121b-437c-9b3f-0bd198f000e6.png</url>
      <title>DEV Community: Adam Cervenka</title>
      <link>https://dev.to/cerveada</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cerveada"/>
    <language>en</language>
    <item>
      <title>Quickly read file or any url in Scala/Java</title>
      <dc:creator>Adam Cervenka</dc:creator>
      <pubDate>Thu, 18 Nov 2021 16:07:10 +0000</pubDate>
      <link>https://dev.to/cerveada/quickly-read-file-or-any-url-in-scalajava-4p60</link>
      <guid>https://dev.to/cerveada/quickly-read-file-or-any-url-in-scalajava-4p60</guid>
      <description>&lt;p&gt;One thing that is missing in Scala/Java standard library is a simple function loading a text file and returning it as a String. Of course this is not a way to deal with big files, but when you just need to load small and simple config file it would be useful.&lt;/p&gt;

&lt;p&gt;Luckily, Apache commons provides such a function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scala"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.commons.io.IOUtils&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.net.URL&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;loadFromUrl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urlString&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;IOUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="py"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urlString&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And as a bonus, you can use it for both local files and resources on the web as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scala"&gt;&lt;code&gt;&lt;span class="nf"&gt;loadFromUrl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"file:///Users/foo/conf.json"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;loadFromUrl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://example.com/"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you inspect the code of &lt;code&gt;IOUtils&lt;/code&gt; you will find that there is proper error handling, that means resources are closed in case of an exception. That part is usually missing in similar quick and simple solutions.&lt;/p&gt;

&lt;p&gt;To use this, you need to add the following dependency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;commons-io&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;commons-io&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.4&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>scala</category>
      <category>java</category>
    </item>
    <item>
      <title>Scala Tip: mapValues may not  do what you expect</title>
      <dc:creator>Adam Cervenka</dc:creator>
      <pubDate>Fri, 15 Oct 2021 08:03:32 +0000</pubDate>
      <link>https://dev.to/cerveada/scala-tip-mapvalues-may-not-do-what-you-expect-2n2e</link>
      <guid>https://dev.to/cerveada/scala-tip-mapvalues-may-not-do-what-you-expect-2n2e</guid>
      <description>&lt;p&gt;Often in Scala you may need to map over values of Map data structure. You can use the usual &lt;code&gt;map&lt;/code&gt; function, but there is also more concise &lt;code&gt;mapValues&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scala"&gt;&lt;code&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="py"&gt;map&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;case&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="py"&gt;mapValues&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;_&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In many situations the result of these two will be identical, but there is one important difference.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mapValues&lt;/code&gt; &lt;em&gt;doesn't apply the provided function&lt;/em&gt; on the value &lt;em&gt;right away&lt;/em&gt;. Instead, it creates a view (wrapper) over the data and only evaluates the function when the value is accessed.&lt;/p&gt;

&lt;p&gt;This is OK if your code doesn't have any side effects, but if it has, it may cause hard to find issues. For example leaking of exceptions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scala"&gt;&lt;code&gt;&lt;span class="nv"&gt;scala&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="py"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Try&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="py"&gt;mapValues&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RuntimeException&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="py"&gt;isSuccess&lt;/span&gt;
&lt;span class="c1"&gt;// returns true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The newly created map will happily leave the &lt;code&gt;Try&lt;/code&gt; wrapper as success, and the exception will be thrown only when the value is accessed later.&lt;/p&gt;

&lt;p&gt;In my opinion, &lt;code&gt;mapValues&lt;/code&gt; name was a poor choice because it seems to suggest the same functionality as map, but only for values. Maybe &lt;code&gt;wrapValues&lt;/code&gt; would be better?&lt;/p&gt;

&lt;p&gt;If you want to be more concise, but still have the same semantics as a &lt;code&gt;map&lt;/code&gt; function, you can use &lt;code&gt;transform&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scala"&gt;&lt;code&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="py"&gt;transform&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>scala</category>
    </item>
    <item>
      <title>Set logback to different level for specific package</title>
      <dc:creator>Adam Cervenka</dc:creator>
      <pubDate>Thu, 14 Oct 2021 12:54:10 +0000</pubDate>
      <link>https://dev.to/cerveada/set-logback-to-different-level-for-specific-package-19db</link>
      <guid>https://dev.to/cerveada/set-logback-to-different-level-for-specific-package-19db</guid>
      <description>&lt;p&gt;If I want to set log level for package &lt;code&gt;com.foo.bar&lt;/code&gt; to &lt;code&gt;TRACE&lt;/code&gt; I can use a system property &lt;code&gt;logback.configurationFile&lt;/code&gt; to define path to logback config.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-Dlogback.configurationFile=/Users/foo/logback.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the Logback config I just need to set a new logger like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&amp;gt;
        &amp;lt;encoder&amp;gt;
            &amp;lt;pattern&amp;gt;%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&amp;lt;/pattern&amp;gt;
        &amp;lt;/encoder&amp;gt;
    &amp;lt;/appender&amp;gt;

    &amp;lt;logger name="com.foo.bar" level="TRACE"/&amp;gt;

    &amp;lt;root level="INFO"&amp;gt;
        &amp;lt;appender-ref ref="STDOUT"/&amp;gt;
    &amp;lt;/root&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>logback</category>
      <category>java</category>
      <category>logging</category>
    </item>
    <item>
      <title>Scala Tip: appending a sequence optionally</title>
      <dc:creator>Adam Cervenka</dc:creator>
      <pubDate>Tue, 31 Aug 2021 08:21:14 +0000</pubDate>
      <link>https://dev.to/cerveada/scala-tip-appending-a-sequence-optionally-18b7</link>
      <guid>https://dev.to/cerveada/scala-tip-appending-a-sequence-optionally-18b7</guid>
      <description>&lt;p&gt;If you want to add option's content to a sequence, you can easily do that using &lt;code&gt;++&lt;/code&gt; or &lt;code&gt;appendAll&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EIepje8d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o1vgva8t120kxle7itji.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EIepje8d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o1vgva8t120kxle7itji.jpeg" alt="Image 2021-07-29 at 15.18.26"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is possible because &lt;code&gt;++&lt;/code&gt; expects collection and there is an implicit conversion from an option to collection in Scala.&lt;/p&gt;

&lt;p&gt;But be careful with &lt;code&gt;:+&lt;/code&gt; because that expects just one element and no conversion will be applied and this happens:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g0dlWSg1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rzebvap41w8to8by9utg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g0dlWSg1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rzebvap41w8to8by9utg.jpeg" alt="Image 2021-07-29 at 15.21.13"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>scala</category>
    </item>
  </channel>
</rss>
