<?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: Ryan Bowlen</title>
    <description>The latest articles on DEV Community by Ryan Bowlen (@bowlendev).</description>
    <link>https://dev.to/bowlendev</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%2F127370%2Fe7acbfce-460e-4b92-bf98-46a1fe610087.jpg</url>
      <title>DEV Community: Ryan Bowlen</title>
      <link>https://dev.to/bowlendev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bowlendev"/>
    <language>en</language>
    <item>
      <title>Learn Java for Free!</title>
      <dc:creator>Ryan Bowlen</dc:creator>
      <pubDate>Thu, 04 Aug 2022 19:26:36 +0000</pubDate>
      <link>https://dev.to/bowlendev/learn-java-for-free-ckj</link>
      <guid>https://dev.to/bowlendev/learn-java-for-free-ckj</guid>
      <description>&lt;p&gt;I am working on a Learn Java for Free playlist on my YouTube for those looking to learn Java from the beginning. Courses will start with the basics and scale up over time. Check it out and consider subscribing!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtube.com/playlist?list=PLdKtjoDJFbs8Q2tl3jq9n688cZiGNXhkN"&gt;Learn Java for Free Course&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>tutorial</category>
      <category>series</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Java: The Main Method</title>
      <dc:creator>Ryan Bowlen</dc:creator>
      <pubDate>Fri, 24 Jun 2022 19:03:56 +0000</pubDate>
      <link>https://dev.to/bowlendev/java-the-main-method-4d0j</link>
      <guid>https://dev.to/bowlendev/java-the-main-method-4d0j</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/11tNVsj_YRg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>java</category>
      <category>basics</category>
      <category>main</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What is OOP?</title>
      <dc:creator>Ryan Bowlen</dc:creator>
      <pubDate>Fri, 24 Jun 2022 19:03:00 +0000</pubDate>
      <link>https://dev.to/bowlendev/what-is-oop-11d9</link>
      <guid>https://dev.to/bowlendev/what-is-oop-11d9</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Pl_-wKo6gQM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>java</category>
      <category>objectoriented</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How Does Java Run?</title>
      <dc:creator>Ryan Bowlen</dc:creator>
      <pubDate>Fri, 24 Jun 2022 18:59:48 +0000</pubDate>
      <link>https://dev.to/bowlendev/how-does-java-run-1pl7</link>
      <guid>https://dev.to/bowlendev/how-does-java-run-1pl7</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/go5b-Qw7PBk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>java</category>
      <category>jvm</category>
      <category>tutorial</category>
      <category>learn</category>
    </item>
    <item>
      <title>Base Conversions</title>
      <dc:creator>Ryan Bowlen</dc:creator>
      <pubDate>Sat, 06 Feb 2021 22:58:01 +0000</pubDate>
      <link>https://dev.to/bowlendev/base-conversions-1473</link>
      <guid>https://dev.to/bowlendev/base-conversions-1473</guid>
      <description>&lt;p&gt;This is a living resource where I will post my number bases videos as I complete them. Enjoy!&lt;/p&gt;

&lt;h1&gt;
  
  
  Intro to Number Bases
&lt;/h1&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/WfQMJhicOjA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  Foundations of Number Bases
&lt;/h1&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ULyCcGwM0ro"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>numberbases</category>
      <category>conversions</category>
      <category>binary</category>
      <category>foundations</category>
    </item>
    <item>
      <title>Loops in Java</title>
      <dc:creator>Ryan Bowlen</dc:creator>
      <pubDate>Tue, 03 Nov 2020 02:46:35 +0000</pubDate>
      <link>https://dev.to/bowlendev/loops-in-java-3cjf</link>
      <guid>https://dev.to/bowlendev/loops-in-java-3cjf</guid>
      <description>&lt;p&gt;An instructional video for my computer science students, this video covers four loops in Java:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/tOVbNkjmLek"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>java</category>
      <category>loops</category>
      <category>tutorial</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Java Arithmetic</title>
      <dc:creator>Ryan Bowlen</dc:creator>
      <pubDate>Wed, 07 Oct 2020 17:59:21 +0000</pubDate>
      <link>https://dev.to/bowlendev/java-arithmetic-3kca</link>
      <guid>https://dev.to/bowlendev/java-arithmetic-3kca</guid>
      <description></description>
      <category>java</category>
      <category>computerscience</category>
      <category>arithmetic</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Build a Trivia App</title>
      <dc:creator>Ryan Bowlen</dc:creator>
      <pubDate>Sat, 03 Oct 2020 03:22:13 +0000</pubDate>
      <link>https://dev.to/bowlendev/how-to-build-a-trivia-app-1713</link>
      <guid>https://dev.to/bowlendev/how-to-build-a-trivia-app-1713</guid>
      <description>&lt;p&gt;Code can be found here: &lt;a href="https://github.com/rabowlen/TriviaApp"&gt;https://github.com/rabowlen/TriviaApp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>springboot</category>
      <category>python</category>
      <category>react</category>
    </item>
    <item>
      <title>Conditional CriteriaBuilder for Optional Params</title>
      <dc:creator>Ryan Bowlen</dc:creator>
      <pubDate>Mon, 30 Mar 2020 01:43:53 +0000</pubDate>
      <link>https://dev.to/bowlendev/conditional-criteriabuilder-for-optional-params-2j6</link>
      <guid>https://dev.to/bowlendev/conditional-criteriabuilder-for-optional-params-2j6</guid>
      <description>&lt;p&gt;Recently I came across an interesting challenge at work where I needed to conditionally query data based on a series of Optional fields — that is, I needed to query what was asked for and nothing else.&lt;/p&gt;

&lt;p&gt;This task was easily (once I figured it out) solved with JPA Specifications.&lt;/p&gt;

&lt;p&gt;Look at the following example where I will use data fields on let’s say…birthday attendees:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2AoEbGtW9YBb-gU-4Q" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2AoEbGtW9YBb-gU-4Q" alt="Two doors, one yellow and one red, give the viewer a choice."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Specification&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Attendee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;filterAttendees&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;firstNameFilter&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lastNameFilter&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;criteriaQuery&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;criteriaBuilder&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Predicate&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;predicates&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;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstNameFilter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isPresent&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstNameFilter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;predicates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criteriaBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;and&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criteriaBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;like&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criteriaBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lower&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"firstName"&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt; &lt;span class="s"&gt;"%"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;firstNameFilter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"%"&lt;/span&gt;&lt;span class="o"&gt;)));&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lastNameFilter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isPresent&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;(&lt;/span&gt;&lt;span class="n"&gt;lastNameFilter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;predicates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criteriaBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;and&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criteriaBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;like&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criteriaBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lower&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"lastName"&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt; &lt;span class="s"&gt;"%"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;lastNameFilter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"%"&lt;/span&gt;&lt;span class="o"&gt;)));&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;criteriaBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;and&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;predicates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toArray&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;Predicate&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;predicates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()]));&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;The example above will fetch any Attendee whose name is LIKE the String provided. Here’s how:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The method takes two Optional parameters, which means that I can provide both, one, or neither. I will talk about this more towards the end.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The line return (root, criteriaQuery, criteriaBuilder) -&amp;gt; passes in the root Attendee, a database query, and the criteria that you build to perform said query. I have written this as a lamba for brevity’s sake, but the older form of writing Specification() will work as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I create a List of Predicates, which will be combined into my criteriaBuilder to make a comprehensive set of criteria. As with English, Predicate here is the basis or the what of the full expression. You will see in the last line that I add these all together into a singular Predicate and use that to create my CriteriaBuilder, which I return.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The bulk of this whole code segment, and what makes it truly conditional are the two similar statements that check that a filter .isPresent() and not empty (that the length is greater than 0). If these conditions are met, I know that my method has been passed parameters that need to be included in my search. Once I have those, I am able to tell the criteriaBuilder to find instances LIKE them in the database and to include them in the CriteriaBuilder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Having those Optional parameters is what really lets this method be dynamic. Because I am handling the chance that a parameter comes in null, I can use this method to look up attendees by full name, just first, or just last. I can even set this up to return all attendees if the parameters were to come back fully blank. The method would be robust and cut out a lot of user error and some form validation on the front end.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for your time and I hope you find a use for this!&lt;/p&gt;

</description>
      <category>java</category>
      <category>spring</category>
      <category>specification</category>
      <category>database</category>
    </item>
    <item>
      <title>What's The Coolest Tool Your Team Implemented Due to Quarantine?</title>
      <dc:creator>Ryan Bowlen</dc:creator>
      <pubDate>Mon, 23 Mar 2020 21:38:12 +0000</pubDate>
      <link>https://dev.to/bowlendev/what-s-the-coolest-tool-your-team-implemented-due-to-quarantine-167k</link>
      <guid>https://dev.to/bowlendev/what-s-the-coolest-tool-your-team-implemented-due-to-quarantine-167k</guid>
      <description>&lt;p&gt;Just wanting to discuss any new or neat tools that have found their way into your work life as a part of quarantine. I'll start: my team started using GeekBot to do our daily stand-ups, as it keeps us asynchronous. We simply answer the prompts in Slack and voila! the responses are sent to our stand-ups channel.&lt;/p&gt;

&lt;p&gt;Share your experiences in the comments. :D&lt;/p&gt;

</description>
      <category>remote</category>
      <category>tools</category>
      <category>discuss</category>
      <category>quarantine</category>
    </item>
    <item>
      <title>Remove Vowels from Strings - Java, JS</title>
      <dc:creator>Ryan Bowlen</dc:creator>
      <pubDate>Mon, 24 Feb 2020 21:14:58 +0000</pubDate>
      <link>https://dev.to/bowlendev/remove-vowels-from-strings-java-js-3chp</link>
      <guid>https://dev.to/bowlendev/remove-vowels-from-strings-java-js-3chp</guid>
      <description></description>
      <category>java</category>
      <category>javascript</category>
      <category>interviewing</category>
      <category>strings</category>
    </item>
    <item>
      <title>Shifting Arrays Right and Left</title>
      <dc:creator>Ryan Bowlen</dc:creator>
      <pubDate>Tue, 18 Feb 2020 20:06:46 +0000</pubDate>
      <link>https://dev.to/bowlendev/shifting-arrays-right-and-left-12n5</link>
      <guid>https://dev.to/bowlendev/shifting-arrays-right-and-left-12n5</guid>
      <description></description>
      <category>arrays</category>
      <category>whiteboarding</category>
      <category>java</category>
      <category>interview</category>
    </item>
  </channel>
</rss>
